LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQWdlcmUgU3lzdGVtcyBJbmMuCiAqIFdpcmVsZXNzIGRldmljZSBkcml2ZXIgZm9yIExpbnV4ICh3bGFnczQ5KS4KICoKICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDMgQWdlcmUgU3lzdGVtcyBJbmMuCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqICAgaHR0cDovL3d3dy5hZ2VyZS5jb20KICoKICogSW5pdGlhbGx5IGRldmVsb3BlZCBieSBUcmlwbGVQb2ludCwgSW5jLgogKiAgIGh0dHA6Ly93d3cudHJpcGxlcG9pbnQuY29tCiAqCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqCiAqICAgVGhpcyBmaWxlIGNvbnRhaW5zIGhhbmRsZXIgZnVuY3Rpb25zIHJlZ2lzdGVyZWQgd2l0aCB0aGUgbmV0X2RldmljZQogKiAgIHN0cnVjdHVyZS4KICoKICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICoKICogU09GVFdBUkUgTElDRU5TRQogKgogKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9ucywKICogd2hpY2ggeW91IHNob3VsZCByZWFkIGNhcmVmdWxseSBiZWZvcmUgdXNpbmcgdGhlIHNvZnR3YXJlLiAgVXNpbmcgdGhpcwogKiBzb2Z0d2FyZSBpbmRpY2F0ZXMgeW91ciBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgSWYgeW91IGRvCiAqIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLCBkbyBub3QgdXNlIHRoZSBzb2Z0d2FyZS4KICoKICogQ29weXJpZ2h0IKkgMjAwMyBBZ2VyZSBTeXN0ZW1zIEluYy4KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoKICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ugb3IgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICogbW9kaWZpY2F0aW9ucywgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgogKgogKiAuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcwogKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBhcyBjb21tZW50cyBpbiB0aGUgY29kZSBhcwogKiAgICB3ZWxsIGFzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKICogICAgZGlzdHJpYnV0aW9uLgogKgogKiAuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgogKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KICoKICogLiBOZWl0aGVyIHRoZSBuYW1lIG9mIEFnZXJlIFN5c3RlbXMgSW5jLiBub3IgdGhlIG5hbWVzIG9mIHRoZSBjb250cmlidXRvcnMKICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCiAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogKgogKiBEaXNjbGFpbWVyCiAqCiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgk0FTIElTlCBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAogKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgSU5GUklOR0VNRU5UIEFORCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCiAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBBTlkKICogVVNFLCBNT0RJRklDQVRJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRISVMgU09GVFdBUkUgSVMgU09MRUxZIEFUIFRIRSBVU0VSUyBPV04KICogUklTSy4gSU4gTk8gRVZFTlQgU0hBTEwgQUdFUkUgU1lTVEVNUyBJTkMuIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQogKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwogKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CiAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAogKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIENPTlRSQUNULCBTVFJJQ1QKICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKICogREFNQUdFLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogaW5jbHVkZSBmaWxlcwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwojaW5jbHVkZSA8d2xfdmVyc2lvbi5oPgoKI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgvc2xhYi5oPgojaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgovLyAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLy8gI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgovLyAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgovLyAjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KLy8gI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgovLyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgovLyAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci8vICNpbmNsdWRlIDxsaW51eC9pbi5oPgovLyAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLy8gI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgovLyAjaW5jbHVkZSA8YXNtL2lvLmg+Ci8vICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci8vICNpbmNsdWRlIDxhc20vYml0b3BzLmg+CgojaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CiNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgovLyAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci8vICNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KLy8gI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgoKI2luY2x1ZGUgPGRlYnVnLmg+CgojaW5jbHVkZSA8aGNmLmg+CiNpbmNsdWRlIDxkaGYuaD4KLy8gI2luY2x1ZGUgPGhjZmRlZi5oPgoKI2luY2x1ZGUgPHdsX2lmLmg+CiNpbmNsdWRlIDx3bF9pbnRlcm5hbC5oPgojaW5jbHVkZSA8d2xfdXRpbC5oPgojaW5jbHVkZSA8d2xfcHJpdi5oPgojaW5jbHVkZSA8d2xfbWFpbi5oPgojaW5jbHVkZSA8d2xfbmV0ZGV2Lmg+CiNpbmNsdWRlIDx3bF93ZXh0Lmg+CgojaWZkZWYgVVNFX1BST0ZJTEUKI2luY2x1ZGUgPHdsX3Byb2ZpbGUuaD4KI2VuZGlmICAvKiBVU0VfUFJPRklMRSAqLwoKI2lmZGVmIEJVU19QQ01DSUEKI2luY2x1ZGUgPHdsX2NzLmg+CiNlbmRpZiAgLyogQlVTX1BDTUNJQSAqLwoKI2lmZGVmIEJVU19QQ0kKI2luY2x1ZGUgPHdsX3BjaS5oPgojZW5kaWYgIC8qIEJVU19QQ0kgKi8KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBnbG9iYWwgdmFyaWFibGVzCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiNpZiBEQkcKZXh0ZXJuIGRiZ19pbmZvX3QgKkRiZ0luZm87CiNlbmRpZiAgLyogREJHICovCgoKI2lmIEhDRl9FTkNBUAojZGVmaW5lIE1UVV9NQVggKEhDRl9NQVhfTVNHIC0gRVRIX0hMRU4gLSA4KQojZWxzZQojZGVmaW5lIE1UVV9NQVggKEhDRl9NQVhfTVNHIC0gRVRIX0hMRU4pCiNlbmRpZgoKLy9zdGF0aWMgaW50IG10dSA9IE1UVV9NQVg7Ci8vTU9EVUxFX1BBUk0obXR1LCAiaSIpOwovL01PRFVMRV9QQVJNX0RFU0MobXR1LCAiTVRVIik7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBtYWNyb3MKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KI2RlZmluZSBCTE9DS19JTlBVVChidWYsIGxlbikgXAogICAgZGVzYy0+YnVmX2FkZHIgPSBidWY7IFwKICAgIGRlc2MtPkJVRl9TSVpFID0gbGVuOyBcCiAgICBzdGF0dXMgPSBoY2ZfcmN2X21zZygmKGxwLT5oY2ZDdHgpLCBkZXNjLCAwKQoKI2RlZmluZSBCTE9DS19JTlBVVF9ETUEoYnVmLCBsZW4pIG1lbWNweSggYnVmLCBkZXNjX25leHQtPmJ1Zl9hZGRyLCBwa3RsZW4gKQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogZnVuY3Rpb24gcHJvdG90eXBlcwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd2xfaW5pdCgpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBXZSBuZXZlciBuZWVkIHRvIGRvIGFueXRoaW5nIHdoZW4gYSAiV2lyZWxlc3MiIGRldmljZSBpcyAiaW5pdGlhbGl6ZWQiCiAqICBieSB0aGUgbmV0IHNvZnR3YXJlLCBiZWNhdXNlIHdlIG9ubHkgcmVnaXN0ZXIgYWxyZWFkeS1mb3VuZCBjYXJkcy4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgZGV2IC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBuZXRfZGV2aWNlIHN0cnVjdHVyZQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICAwIG9uIHN1Y2Nlc3MKICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IHdsX2luaXQoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQp7Ci8vICAgIHVuc2lnbmVkIGxvbmcgICAgICAgZmxhZ3M7Ci8vICAgIHN0cnVjdCB3bF9wcml2YXRlICAgKmxwID0gd2xfcHJpdihkZXYpOwogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIERCR19GVU5DKCAid2xfaW5pdCIgKTsKICAgIERCR19FTlRFUiggRGJnSW5mbyApOwoKICAgIERCR19QQVJBTSggRGJnSW5mbywgImRldiIsICIlcyAoMHglcCkiLCBkZXYtPm5hbWUsIGRldiApOwoKICAgIC8qIE5vdGhpbmcgdG8gZG8sIGJ1dCBncmFiIHRoZSBzcGlubG9jayBhbnl3YXkganVzdCBpbiBjYXNlIHdlIGV2ZXIgbmVlZAogICAgICAgdGhpcyByb3V0aW5lICovCi8vICB3bF9sb2NrKCBscCwgJmZsYWdzICk7Ci8vICB3bF91bmxvY2soIGxwLCAmZmxhZ3MgKTsKCiAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKICAgIHJldHVybiAwOwp9IC8vIHdsX2luaXQKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX2NvbmZpZygpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBJbXBsZW1lbnQgdGhlIFNJT0NTSUZNQVAgaW50ZXJmYWNlLgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBkZXYgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIG5ldF9kZXZpY2Ugc3RydWN0dXJlCiAqICAgICAgbWFwIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBpZm1hcCBzdHJ1Y3R1cmUKICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgMCBvbiBzdWNjZXNzCiAqICAgICAgZXJybm8gb3RoZXJ3aXNlCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCB3bF9jb25maWcoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZm1hcCAqbWFwICkKewogICAgREJHX0ZVTkMoICJ3bF9jb25maWciICk7CiAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKCiAgICBEQkdfUEFSQU0oIERiZ0luZm8sICJkZXYiLCAiJXMgKDB4JXApIiwgZGV2LT5uYW1lLCBkZXYgKTsKICAgIERCR19QQVJBTSggRGJnSW5mbywgIm1hcCIsICIweCVwIiwgbWFwICk7CgogICAgLyogVGhlIG9ubHkgdGhpbmcgd2UgY2FyZSBhYm91dCBoZXJlIGlzIGEgcG9ydCBjaGFuZ2UuIFNpbmNlIHRoaXMgbm90IG5lZWRlZCwKICAgICAgIGlnbm9yZSB0aGUgcmVxdWVzdC4gKi8KICAgIERCR19UUkFDRSggRGJnSW5mbywgIiVzOiAlcyBjYWxsZWQuXG4iLCBkZXYtPm5hbWUsIF9fRlVOQ19fICk7CgogICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CiAgICByZXR1cm4gMDsKfSAvLyB3bF9jb25maWcKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX3N0YXRzKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIFJldHVybiB0aGUgY3VycmVudCBkZXZpY2Ugc3RhdGlzdGljcy4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgZGV2IC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBuZXRfZGV2aWNlIHN0cnVjdHVyZQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBhIHBvaW50ZXIgdG8gYSBuZXRfZGV2aWNlX3N0YXRzIHN0cnVjdHVyZSBjb250YWluaW5nIHRoZSBuZXR3b3JrCiAqICAgICAgc3RhdGlzdGljcy4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKndsX3N0YXRzKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKewojaWZkZWYgVVNFX1dEUwogICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OwojZW5kaWYgIC8qIFVTRV9XRFMgKi8KICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgICBmbGFnczsKICAgIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICAgICAqcFN0YXRzOwogICAgc3RydWN0IHdsX3ByaXZhdGUgICAgICAgICAgICpscCA9IHdsX3ByaXYoZGV2KTsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICAvL0RCR19GVU5DKCAid2xfc3RhdHMiICk7CiAgICAvL0RCR19FTlRFUiggRGJnSW5mbyApOwogICAgLy9EQkdfUEFSQU0oIERiZ0luZm8sICJkZXYiLCAiJXMgKDB4JXApIiwgZGV2LT5uYW1lLCBkZXYgKTsKCiAgICBwU3RhdHMgPSBOVUxMOwoKICAgIHdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKCiNpZmRlZiBVU0VfUlRTCiAgICBpZiggbHAtPnVzZVJUUyA9PSAxICkgewoJd2xfdW5sb2NrKCBscCwgJmZsYWdzICk7CgoJLy9EQkdfTEVBVkUoIERiZ0luZm8gKTsKCXJldHVybiBOVUxMOwogICAgfQojZW5kaWYgIC8qIFVTRV9SVFMgKi8KCiAgICAvKiBSZXR1cm4gdGhlIHN0YXRpc3RpY3MgZm9yIHRoZSBhcHByb3ByaWF0ZSBkZXZpY2UgKi8KI2lmZGVmIFVTRV9XRFMKCiAgICBmb3IoIGNvdW50ID0gMDsgY291bnQgPCBOVU1fV0RTX1BPUlRTOyBjb3VudCsrICkgewoJaWYoIGRldiA9PSBscC0+d2RzX3BvcnRbY291bnRdLmRldiApIHsKCSAgICBwU3RhdHMgPSAmKCBscC0+d2RzX3BvcnRbY291bnRdLnN0YXRzICk7Cgl9CiAgICB9CgojZW5kaWYgIC8qIFVTRV9XRFMgKi8KCiAgICAvKiBJZiBwU3RhdHMgaXMgc3RpbGwgTlVMTCwgdGhlbiB0aGUgZGV2aWNlIGlzIG5vdCBhIFdEUyBwb3J0ICovCiAgICBpZiggcFN0YXRzID09IE5VTEwgKSB7CiAgICAgICAgcFN0YXRzID0gJiggbHAtPnN0YXRzICk7CiAgICB9CgogICAgd2xfdW5sb2NrKCBscCwgJmZsYWdzICk7CgogICAgLy9EQkdfTEVBVkUoIERiZ0luZm8gKTsKCiAgICByZXR1cm4gcFN0YXRzOwp9IC8vIHdsX3N0YXRzCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF9vcGVuKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIE9wZW4gdGhlIGRldmljZS4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgZGV2IC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBuZXRfZGV2aWNlIHN0cnVjdHVyZQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICAwIG9uIHN1Y2Nlc3MKICogICAgICBlcnJubyBvdGhlcndpc2UKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IHdsX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKewogICAgaW50ICAgICAgICAgICAgICAgICBzdGF0dXMgPSBIQ0ZfU1VDQ0VTUzsKICAgIHN0cnVjdCB3bF9wcml2YXRlICAgKmxwID0gd2xfcHJpdihkZXYpOwogICAgdW5zaWduZWQgbG9uZyAgICAgICBmbGFnczsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICBEQkdfRlVOQyggIndsX29wZW4iICk7CiAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKCiAgICB3bF9sb2NrKCBscCwgJmZsYWdzICk7CgojaWZkZWYgVVNFX1JUUwogICAgaWYoIGxwLT51c2VSVFMgPT0gMSApIHsKCURCR19UUkFDRSggRGJnSW5mbywgIlNraXBwaW5nIGRldmljZSBvcGVuLCBpbiBSVFMgbW9kZVxuIiApOwoJd2xfdW5sb2NrKCBscCwgJmZsYWdzICk7CglEQkdfTEVBVkUoIERiZ0luZm8gKTsKCXJldHVybiAtRUlPOwogICAgfQojZW5kaWYgIC8qIFVTRV9SVFMgKi8KCiNpZmRlZiBVU0VfUFJPRklMRQogICAgcGFyc2VfY29uZmlnKCBkZXYgKTsKI2VuZGlmCgogICAgaWYoIGxwLT5wb3J0U3RhdGUgPT0gV1ZMQU5fUE9SVF9TVEFURV9ESVNBQkxFRCApIHsKCURCR19UUkFDRSggRGJnSW5mbywgIkVuYWJsaW5nIFBvcnQgMFxuIiApOwoJc3RhdHVzID0gd2xfZW5hYmxlKCBscCApOwoKICAgICAgICBpZiggc3RhdHVzICE9IEhDRl9TVUNDRVNTICkgewogICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJFbmFibGUgcG9ydCAwIGZhaWxlZDogMHgleFxuIiwgc3RhdHVzICk7CiAgICAgICAgfQogICAgfQoKICAgIC8vIEhvbGRpbmcgdGhlIGxvY2sgdG9vIGxvbmcsIG1ha2UgYSBnYXAgdG8gYWxsb3cgb3RoZXIgcHJvY2Vzc2VzCiAgICB3bF91bmxvY2sobHAsICZmbGFncyk7CiAgICB3bF9sb2NrKCBscCwgJmZsYWdzICk7CgogICAgaWYgKCBzdHJsZW4oIGxwLT5md19pbWFnZV9maWxlbmFtZSApICkgewoJREJHX1RSQUNFKCBEYmdJbmZvLCAiOz8/Pz8gS2x1ZGd5IHdheSB0byBmb3JjZSBhIGRvd25sb2FkXG4iICk7CglzdGF0dXMgPSB3bF9nbyggbHAgKTsKICAgIH0gZWxzZSB7CglzdGF0dXMgPSB3bF9hcHBseSggbHAgKTsKICAgIH0KCiAgICAvLyBIb2xkaW5nIHRoZSBsb2NrIHRvbyBsb25nLCBtYWtlIGEgZ2FwIHRvIGFsbG93IG90aGVyIHByb2Nlc3NlcwogICAgd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOwogICAgd2xfbG9jayggbHAsICZmbGFncyApOwoKICAgIGlmKCBzdGF0dXMgIT0gSENGX1NVQ0NFU1MgKSB7CgkvLyBVbnN1Y2Nlc3NmdWwsIHRyeSByZXNldCBvZiB0aGUgY2FyZCB0byByZWNvdmVyCglzdGF0dXMgPSB3bF9yZXNldCggZGV2ICk7CiAgICB9CgogICAgLy8gSG9sZGluZyB0aGUgbG9jayB0b28gbG9uZywgbWFrZSBhIGdhcCB0byBhbGxvdyBvdGhlciBwcm9jZXNzZXMKICAgIHdsX3VubG9jayhscCwgJmZsYWdzKTsKICAgIHdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKCiAgICBpZiggc3RhdHVzID09IEhDRl9TVUNDRVNTICkgewoJbmV0aWZfY2Fycmllcl9vbiggZGV2ICk7CglXTF9XRFNfTkVUSUZfQ0FSUklFUl9PTiggbHAgKTsKCglscC0+aXNfaGFuZGxpbmdfaW50ID0gV0xfSEFORExJTkdfSU5UOyAvLyBTdGFydCBoYW5kbGluZyBpbnRlcnJ1cHRzCiAgICAgICAgd2xfYWN0X2ludF9vbiggbHAgKTsKCgluZXRpZl9zdGFydF9xdWV1ZSggZGV2ICk7CglXTF9XRFNfTkVUSUZfU1RBUlRfUVVFVUUoIGxwICk7CiAgICB9IGVsc2UgewogICAgICAgIHdsX2hjZl9lcnJvciggZGV2LCBzdGF0dXMgKTsJCS8qIFJlcG9ydCB0aGUgZXJyb3IgKi8KICAgICAgICBuZXRpZl9kZXZpY2VfZGV0YWNoKCBkZXYgKTsJCS8qIFN0b3AgdGhlIGRldmljZSBhbmQgcXVldWUgKi8KICAgIH0KCiAgICB3bF91bmxvY2soIGxwLCAmZmxhZ3MgKTsKCiAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKICAgIHJldHVybiBzdGF0dXM7Cn0gLy8gd2xfb3BlbgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd2xfY2xvc2UoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgQ2xvc2UgdGhlIGRldmljZS4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgZGV2IC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBuZXRfZGV2aWNlIHN0cnVjdHVyZQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICAwIG9uIHN1Y2Nlc3MKICogICAgICBlcnJubyBvdGhlcndpc2UKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IHdsX2Nsb3NlKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKewogICAgc3RydWN0IHdsX3ByaXZhdGUgICAqbHAgPSB3bF9wcml2KGRldik7CiAgICB1bnNpZ25lZCBsb25nICAgZmxhZ3M7CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgREJHX0ZVTkMoIndsX2Nsb3NlIik7CiAgICBEQkdfRU5URVIoRGJnSW5mbyk7CiAgICBEQkdfUEFSQU0oRGJnSW5mbywgImRldiIsICIlcyAoMHglcCkiLCBkZXYtPm5hbWUsIGRldik7CgogICAgLyogTWFyayB0aGUgYWRhcHRlciBhcyBidXN5ICovCiAgICBuZXRpZl9zdG9wX3F1ZXVlKCBkZXYgKTsKICAgIFdMX1dEU19ORVRJRl9TVE9QX1FVRVVFKCBscCApOwoKICAgIG5ldGlmX2NhcnJpZXJfb2ZmKCBkZXYgKTsKICAgIFdMX1dEU19ORVRJRl9DQVJSSUVSX09GRiggbHAgKTsKCiAgICAvKiBTaHV0ZG93biB0aGUgYWRhcHRlcjoKICAgICAgICAgICAgRGlzYWJsZSBhZGFwdGVyIGludGVycnVwdHMKICAgICAgICAgICAgU3RvcCBUeC9SeAogICAgICAgICAgICBVcGRhdGUgc3RhdGlzdGljcwogICAgICAgICAgICBTZXQgbG93IHBvd2VyIG1vZGUKICAgICovCgogICAgd2xfbG9jayggbHAsICZmbGFncyApOwoKICAgIHdsX2FjdF9pbnRfb2ZmKCBscCApOwogICAgbHAtPmlzX2hhbmRsaW5nX2ludCA9IFdMX05PVF9IQU5ETElOR19JTlQ7IC8vIFN0b3AgaGFuZGxpbmcgaW50ZXJydXB0cwoKI2lmZGVmIFVTRV9SVFMKICAgIGlmKCBscC0+dXNlUlRTID09IDEgKSB7CglEQkdfVFJBQ0UoIERiZ0luZm8sICJTa2lwcGluZyBkZXZpY2UgY2xvc2UsIGluIFJUUyBtb2RlXG4iICk7Cgl3bF91bmxvY2soIGxwLCAmZmxhZ3MgKTsKCURCR19MRUFWRSggRGJnSW5mbyApOwoJcmV0dXJuIC1FSU87CiAgICB9CiNlbmRpZiAgLyogVVNFX1JUUyAqLwoKICAgIC8qIERpc2FibGUgdGhlIHBvcnRzICovCiAgICB3bF9kaXNhYmxlKCBscCApOwoKICAgIHdsX3VubG9jayggbHAsICZmbGFncyApOwoKICAgIERCR19MRUFWRSggRGJnSW5mbyApOwogICAgcmV0dXJuIDA7Cn0gLy8gd2xfY2xvc2UKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCnN0YXRpYyB2b2lkIHdsX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCnsKICAgIHN0cm5jcHkoaW5mby0+ZHJpdmVyLCBEUklWRVJfTkFNRSwgc2l6ZW9mKGluZm8tPmRyaXZlcikgLSAxKTsKICAgIHN0cm5jcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT05fU1RSLCBzaXplb2YoaW5mby0+dmVyc2lvbikgLSAxKTsKLy8Jc3RybmNweShpbmZvLmZ3X3ZlcnNpb24sIHByaXYtPmZ3X25hbWUsCi8vCXNpemVvZihpbmZvLmZ3X3ZlcnNpb24pIC0gMSk7CgogICAgaWYgKGRldi0+ZGV2LnBhcmVudCkgewogICAgCWRldl9zZXRfbmFtZShkZXYtPmRldi5wYXJlbnQsICIlcyIsIGluZm8tPmJ1c19pbmZvKTsKCS8vc3RybmNweShpbmZvLT5idXNfaW5mbywgZGV2LT5kZXYucGFyZW50LT5idXNfaWQsCgkvLwlzaXplb2YoaW5mby0+YnVzX2luZm8pIC0gMSk7CiAgICB9IGVsc2UgewoJc25wcmludGYoaW5mby0+YnVzX2luZm8sIHNpemVvZihpbmZvLT5idXNfaW5mbykgLSAxLAoJCSJQQ01DSUEgRklYTUUiKTsKLy8JCSAgICAiUENNQ0lBIDB4JWx4IiwgcHJpdi0+aHcuaW9iYXNlKTsKICAgIH0KfSAvLyB3bF9nZXRfZHJ2aW5mbwoKc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyB3bF9ldGh0b29sX29wcyA9IHsKICAgIC5nZXRfZHJ2aW5mbyA9IHdsX2dldF9kcnZpbmZvLAogICAgLmdldF9saW5rID0gZXRodG9vbF9vcF9nZXRfbGluaywKfTsKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF9pb2N0bCgpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBUaGUgSU9DVEwgaGFuZGxlciBmb3IgdGhlIGRldmljZS4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgZGV2IC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBuZXRfZGV2aWNlIHN0cnVjdC4KICogICAgICBycSAgLSBhIHBvaW50ZXIgdG8gdGhlIElPQ1RMIHJlcXVlc3QgYnVmZmVyLgogKiAgICAgIGNtZCAtIHRoZSBJT0NUTCBjb21tYW5kIGNvZGUuCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIDAgb24gc3VjY2VzcwogKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQgd2xfaW9jdGwoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQgKQp7CiAgICBzdHJ1Y3Qgd2xfcHJpdmF0ZSAgKmxwID0gd2xfcHJpdihkZXYpOwogICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgZmxhZ3M7CiAgICBpbnQgICAgICAgICAgICAgICAgICAgICByZXQgPSAwOwogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIERCR19GVU5DKCAid2xfaW9jdGwiICk7CiAgICBEQkdfRU5URVIoRGJnSW5mbyk7CiAgICBEQkdfUEFSQU0oRGJnSW5mbywgImRldiIsICIlcyAoMHglcCkiLCBkZXYtPm5hbWUsIGRldik7CiAgICBEQkdfUEFSQU0oRGJnSW5mbywgInJxIiwgIjB4JXAiLCBycSk7CiAgICBEQkdfUEFSQU0oRGJnSW5mbywgImNtZCIsICIweCUwNHgiLCBjbWQpOwoKICAgIHdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKCiAgICB3bF9hY3RfaW50X29mZiggbHAgKTsKCiNpZmRlZiBVU0VfUlRTCiAgICBpZiggbHAtPnVzZVJUUyA9PSAxICkgewoJLyogSGFuZGxlIGFueSBSVFMgSU9DVEwgaGVyZSAqLwoJaWYoIGNtZCA9PSBXTF9JT0NUTF9SVFMgKSB7CgkgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiSU9DVEw6IFdMX0lPQ1RMX1JUU1xuIiApOwoJICAgIHJldCA9IHd2bGFuX3J0cyggKHN0cnVjdCBydHNyZXEgKilycSwgZGV2LT5iYXNlX2FkZHIgKTsKCX0gZWxzZSB7CgkgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiSU9DVEwgbm90IHN1cHBvcnRlZCBpbiBSVFMgbW9kZTogMHglWFxuIiwgY21kICk7CgkgICAgcmV0ID0gLUVPUE5PVFNVUFA7Cgl9CgoJZ290byBvdXRfYWN0X2ludF9vbl91bmxvY2s7CiAgICB9CiNlbmRpZiAgLyogVVNFX1JUUyAqLwoKICAgIC8qIE9ubHkgaGFuZGxlIFVJTCBJT0NUTCByZXF1ZXN0cyB3aGVuIHRoZSBVSUwgaGFzIHRoZSBzeXN0ZW0gYmxvY2tlZC4gKi8KICAgIGlmKCAhKCggbHAtPmZsYWdzICYgV1ZMQU4yX1VJTF9CVVNZICkgJiYgKCBjbWQgIT0gV1ZMQU4yX0lPQ1RMX1VJTCApKSkgewojaWZkZWYgVVNFX1VJTAoJc3RydWN0IHVpbHJlcSAgKnVycSA9IChzdHJ1Y3QgdWlscmVxICopcnE7CiNlbmRpZiAvKiBVU0VfVUlMICovCgoJc3dpdGNoKCBjbWQgKSB7CgkJLy8gPT09PT09PT09PT09PT09PT09IFByaXZhdGUgSU9DVExzICh1cCB0byAxNikgPT09PT09PT09PT09PT09PT09CiNpZmRlZiBVU0VfVUlMCgljYXNlIFdWTEFOMl9JT0NUTF9VSUw6CgkgICAgIERCR19UUkFDRSggRGJnSW5mbywgIklPQ1RMOiBXVkxBTjJfSU9DVExfVUlMXG4iICk7CgkgICAgIHJldCA9IHd2bGFuX3VpbCggdXJxLCBscCApOwoJICAgICBicmVhazsKI2VuZGlmICAvKiBVU0VfVUlMICovCgoJZGVmYXVsdDoKCSAgICAgREJHX1RSQUNFKERiZ0luZm8sICJJT0NUTCBDT0RFIE5PVCBTVVBQT1JURUQ6IDB4JVhcbiIsIGNtZCApOwoJICAgICByZXQgPSAtRU9QTk9UU1VQUDsKCSAgICAgYnJlYWs7Cgl9CiAgICB9IGVsc2UgewoJREJHX1dBUk5JTkcoIERiZ0luZm8sICJERVZJQ0UgSVMgQlVTWSwgQ0FOTk9UIFBST0NFU1MgUkVRVUVTVFxuIiApOwoJcmV0ID0gLUVCVVNZOwogICAgfQoKI2lmZGVmIFVTRV9SVFMKb3V0X2FjdF9pbnRfb25fdW5sb2NrOgojZW5kaWYgIC8qIFVTRV9SVFMgKi8KICAgIHdsX2FjdF9pbnRfb24oIGxwICk7CgogICAgd2xfdW5sb2NrKCBscCwgJmZsYWdzICk7CgogICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CiAgICByZXR1cm4gcmV0Owp9IC8vIHdsX2lvY3RsCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgojaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKdm9pZCB3bF9wb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCnsKICAgIHN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYoZGV2KTsKICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAgICBzdHJ1Y3QgcHRfcmVncyByZWdzOwoKICAgIHdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKICAgIHdsX2lzcihkZXYtPmlycSwgZGV2LCAmcmVncyk7CiAgICB3bF91bmxvY2soIGxwLCAmZmxhZ3MgKTsKfQojZW5kaWYKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX3R4X3RpbWVvdXQoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgVGhlIGhhbmRsZXIgY2FsbGVkIHdoZW4sIGZvciBzb21lIHJlYXNvbiwgYSBUeCByZXF1ZXN0IGlzIG5vdCBjb21wbGV0ZWQuCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIGRldiAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgbmV0X2RldmljZSBzdHJ1Y3QuCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIE4vQQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIHdsX3R4X3RpbWVvdXQoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQp7CiNpZmRlZiBVU0VfV0RTCiAgICBpbnQgICAgICAgICAgICAgICAgICAgICBjb3VudDsKI2VuZGlmICAvKiBVU0VfV0RTICovCiAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICBmbGFnczsKICAgIHN0cnVjdCB3bF9wcml2YXRlICAgICAgICpscCA9IHdsX3ByaXYoZGV2KTsKICAgIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpwU3RhdHMgPSBOVUxMOwogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIERCR19GVU5DKCAid2xfdHhfdGltZW91dCIgKTsKICAgIERCR19FTlRFUiggRGJnSW5mbyApOwoKICAgIERCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXM6IFRyYW5zbWl0IHRpbWVvdXQuXG4iLCBkZXYtPm5hbWUgKTsKCiAgICB3bF9sb2NrKCBscCwgJmZsYWdzICk7CgojaWZkZWYgVVNFX1JUUwogICAgaWYoIGxwLT51c2VSVFMgPT0gMSApIHsKCURCR19UUkFDRSggRGJnSW5mbywgIlNraXBwaW5nIHR4X3RpbWVvdXQgaGFuZGxlciwgaW4gUlRTIG1vZGVcbiIgKTsKCXdsX3VubG9jayggbHAsICZmbGFncyApOwoKCURCR19MRUFWRSggRGJnSW5mbyApOwoJcmV0dXJuOwogICAgfQojZW5kaWYgIC8qIFVTRV9SVFMgKi8KCiAgICAvKiBGaWd1cmUgb3V0IHdoaWNoIGRldmljZSAodGhlICJyb290IiBkZXZpY2Ugb3IgV0RTIHBvcnQpIHRoaXMgdGltZW91dAogICAgICAgaXMgZm9yICovCiNpZmRlZiBVU0VfV0RTCgogICAgZm9yKCBjb3VudCA9IDA7IGNvdW50IDwgTlVNX1dEU19QT1JUUzsgY291bnQrKyApIHsKCWlmKCBkZXYgPT0gbHAtPndkc19wb3J0W2NvdW50XS5kZXYgKSB7CgkgICAgcFN0YXRzID0gJiggbHAtPndkc19wb3J0W2NvdW50XS5zdGF0cyApOwoKCSAgICAvKiBCcmVhayB0aGUgbG9vcCBzbyB0aGF0IHdlIGNhbiB1c2UgdGhlIGNvdW50ZXIgdG8gYWNjZXNzIFdEUwoJICAgICAgIGluZm9ybWF0aW9uIGluIHRoZSBwcml2YXRlIHN0cnVjdHVyZSAqLwoJICAgIGJyZWFrOwoJfQogICAgfQoKI2VuZGlmICAvKiBVU0VfV0RTICovCgogICAgLyogSWYgcFN0YXRzIGlzIHN0aWxsIE5VTEwsIHRoZW4gdGhlIGRldmljZSBpcyBub3QgYSBXRFMgcG9ydCAqLwogICAgaWYoIHBTdGF0cyA9PSBOVUxMICkgewoJcFN0YXRzID0gJiggbHAtPnN0YXRzICk7CiAgICB9CgogICAgLyogQWNjdW11bGF0ZSB0aGUgdGltZW91dCBlcnJvciAqLwogICAgcFN0YXRzLT50eF9lcnJvcnMrKzsKCiAgICB3bF91bmxvY2soIGxwLCAmZmxhZ3MgKTsKCiAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKICAgIHJldHVybjsKfSAvLyB3bF90eF90aW1lb3V0Ci8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF9zZW5kKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIFRoZSByb3V0aW5lIHdoaWNoIHBlcmZvcm1zIGRhdGEgdHJhbnNtaXRzLgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBscCAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHdsX3ByaXZhdGUgc3RydWN0LgogKgogKiAgUkVUVVJOUzoKICoKICogICAgICAwIG9uIHN1Y2Nlc3MKICogICAgICAxIG9uIGVycm9yCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCB3bF9zZW5kKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQp7CgogICAgaW50ICAgICAgICAgICAgICAgICBzdGF0dXM7CiAgICBERVNDX1NUUkNUICAgICAgICAgICpkZXNjOwogICAgV1ZMQU5fTEZSQU1FICAgICAgICAqdHhGID0gTlVMTDsKICAgIHN0cnVjdCBsaXN0X2hlYWQgICAgKmVsZW1lbnQ7CiAgICBpbnQgICAgICAgICAgICAgICAgIGxlbjsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICBEQkdfRlVOQyggIndsX3NlbmQiICk7CgogICAgaWYoIGxwID09IE5VTEwgKSB7CiAgICAgICAgREJHX0VSUk9SKCBEYmdJbmZvLCAiUHJpdmF0ZSBhZGFwdGVyIHN0cnVjdCBpcyBOVUxMXG4iICk7CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQogICAgaWYoIGxwLT5kZXYgPT0gTlVMTCApIHsKICAgICAgICBEQkdfRVJST1IoIERiZ0luZm8sICJuZXRfZGV2aWNlIHN0cnVjdCBpbiB3bF9wcml2YXRlIGlzIE5VTExcbiIgKTsKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9CgogICAgLyogQ2hlY2sgZm9yIHRoZSBhdmFpbGFiaWxpdHkgb2YgRklEczsgaWYgbm9uZSBhcmUgYXZhaWxhYmxlLCBkb24ndCB0YWtlIGFueQogICAgICAgZnJhbWVzIG9mZiB0aGUgdHhRICovCiAgICBpZiggbHAtPmhjZkN0eC5JRkJfUnNjSW5kID09IDAgKSB7CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQoKICAgIC8qIFJlY2xhaW0gdGhlIFR4USBFbGVtZW50cyBhbmQgcGxhY2UgdGhlbSBiYWNrIG9uIHRoZSBmcmVlIHF1ZXVlICovCiAgICBpZiggIWxpc3RfZW1wdHkoICYoIGxwLT50eFFbMF0gKSkpIHsKICAgICAgICBlbGVtZW50ID0gbHAtPnR4UVswXS5uZXh0OwoKICAgICAgICB0eEYgPSAoV1ZMQU5fTEZSQU1FICogKWxpc3RfZW50cnkoIGVsZW1lbnQsIFdWTEFOX0xGUkFNRSwgbm9kZSApOwogICAgICAgIGlmKCB0eEYgIT0gTlVMTCApIHsKICAgICAgICAgICAgbHAtPnR4Ri5za2IgID0gdHhGLT5mcmFtZS5za2I7CiAgICAgICAgICAgIGxwLT50eEYucG9ydCA9IHR4Ri0+ZnJhbWUucG9ydDsKCiAgICAgICAgICAgIHR4Ri0+ZnJhbWUuc2tiICA9IE5VTEw7CiAgICAgICAgICAgIHR4Ri0+ZnJhbWUucG9ydCA9IDA7CgogICAgICAgICAgICBsaXN0X2RlbCggJiggdHhGLT5ub2RlICkpOwogICAgICAgICAgICBsaXN0X2FkZCggZWxlbWVudCwgJiggbHAtPnR4RnJlZSApKTsKCiAgICAgICAgICAgIGxwLT50eFFfY291bnQtLTsKCiAgICAgICAgICAgIGlmKCBscC0+dHhRX2NvdW50IDwgVFhfUV9MT1dfV0FURVJfTUFSSyApIHsKICAgICAgICAgICAgICAgIGlmKCBscC0+bmV0aWZfcXVldWVfb24gPT0gRkFMU0UgKSB7CiAgICAgICAgICAgICAgICAgICAgREJHX1RYKCBEYmdJbmZvLCAiS2lja3N0YXJ0aW5nIFE6ICVkXG4iLCBscC0+dHhRX2NvdW50ICk7CiAgICAgICAgICAgICAgICAgICAgbmV0aWZfd2FrZV9xdWV1ZSggbHAtPmRldiApOwogICAgICAgICAgICAgICAgICAgIFdMX1dEU19ORVRJRl9XQUtFX1FVRVVFKCBscCApOwogICAgICAgICAgICAgICAgICAgIGxwLT5uZXRpZl9xdWV1ZV9vbiA9IFRSVUU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgaWYoIGxwLT50eEYuc2tiID09IE5VTEwgKSB7CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQoKICAgIC8qIElmIHRoZSBkZXZpY2UgaGFzIHJlc291cmNlcyAoRklEcykgYXZhaWxhYmxlLCB0aGVuIFR4IHRoZSBwYWNrZXQgKi8KICAgIC8qIEZvcm1hdCB0aGUgVHhSZXF1ZXN0IGFuZCBzZW5kIGl0IHRvIHRoZSBhZGFwdGVyICovCiAgICBsZW4gPSBscC0+dHhGLnNrYi0+bGVuIDwgRVRIX1pMRU4gPyBFVEhfWkxFTiA6IGxwLT50eEYuc2tiLT5sZW47CgogICAgZGVzYyAgICAgICAgICAgICAgICAgICAgPSAmKCBscC0+ZGVzY190eCApOwogICAgZGVzYy0+YnVmX2FkZHIgICAgICAgICAgPSBscC0+dHhGLnNrYi0+ZGF0YTsKICAgIGRlc2MtPkJVRl9DTlQgICAgICAgICAgID0gbGVuOwogICAgZGVzYy0+bmV4dF9kZXNjX2FkZHIgICAgPSBOVUxMOwoKICAgIHN0YXR1cyA9IGhjZl9zZW5kX21zZyggJiggbHAtPmhjZkN0eCApLCBkZXNjLCBscC0+dHhGLnBvcnQgKTsKCiAgICBpZiggc3RhdHVzID09IEhDRl9TVUNDRVNTICkgewogICAgICAgIGxwLT5kZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKCiAgICAgICAgREJHX1RYKCBEYmdJbmZvLCAiVHJhbnNtaXQuLi5cbiIgKTsKCiAgICAgICAgaWYoIGxwLT50eEYucG9ydCA9PSBIQ0ZfUE9SVF8wICkgewogICAgICAgICAgICBscC0+c3RhdHMudHhfcGFja2V0cysrOwogICAgICAgICAgICBscC0+c3RhdHMudHhfYnl0ZXMgKz0gbHAtPnR4Ri5za2ItPmxlbjsKICAgICAgICB9CgojaWZkZWYgVVNFX1dEUwogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGxwLT53ZHNfcG9ydFsoKCBscC0+dHhGLnBvcnQgPj4gOCApIC0gMSldLnN0YXRzLnR4X3BhY2tldHMrKzsKICAgICAgICAgICAgbHAtPndkc19wb3J0WygoIGxwLT50eEYucG9ydCA+PiA4ICkgLSAxKV0uc3RhdHMudHhfYnl0ZXMgKz0gbHAtPnR4Ri5za2ItPmxlbjsKICAgICAgICB9CgojZW5kaWYgIC8qIFVTRV9XRFMgKi8KCiAgICAgICAgLyogRnJlZSB0aGUgc2tiIGFuZCBwZXJmb3JtIHF1ZXVlIGNsZWFudXAsIGFzIHRoZSBidWZmZXIgd2FzCiAgICAgICAgICAgIHRyYW5zbWl0dGVkIHN1Y2Nlc3NmdWxseSAqLwogICAgICAgIGRldl9rZnJlZV9za2IoIGxwLT50eEYuc2tiICk7CgogICAgICAgIGxwLT50eEYuc2tiID0gTlVMTDsKICAgICAgICBscC0+dHhGLnBvcnQgPSAwOwogICAgfQoKICAgIHJldHVybiBUUlVFOwp9IC8vIHdsX3NlbmQKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX3R4KCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIFRoZSBUeCBoYW5kbGVyIGZ1bmN0aW9uIGZvciB0aGUgbmV0d29yayBsYXllci4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgc2tiIC0gYSBwb2ludGVyIHRvIHRoZSBza19idWZmIHN0cnVjdHVyZSBjb250YWluaW5nIHRoZSBkYXRhIHRvIHRyYW5zZmVyLgogKiAgICAgIGRldiAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgbmV0X2RldmljZSBzdHJ1Y3R1cmUuCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIDAgb24gc3VjY2VzcwogKiAgICAgIDEgb24gZXJyb3IKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IHdsX3R4KCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcG9ydCApCnsKICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgIGZsYWdzOwogICAgc3RydWN0IHdsX3ByaXZhdGUgICAgICAgKmxwID0gd2xfcHJpdihkZXYpOwogICAgV1ZMQU5fTEZSQU1FICAgICAgICAgICAgKnR4RiA9IE5VTEw7CiAgICBzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICAqZWxlbWVudDsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICBEQkdfRlVOQyggIndsX3R4IiApOwoKICAgIC8qIEdyYWIgdGhlIHNwaW5sb2NrICovCiAgICB3bF9sb2NrKCBscCwgJmZsYWdzICk7CgogICAgaWYoIGxwLT5mbGFncyAmIFdWTEFOMl9VSUxfQlVTWSApIHsKICAgICAgICBEQkdfV0FSTklORyggRGJnSW5mbywgIlVJTCBoYXMgZGV2aWNlIGJsb2NrZWRcbiIgKTsKICAgICAgICAvKiBTdGFydCBkcm9wcGluZyBwYWNrZXRzIGhlcmU/Pz8gKi8KCXdsX3VubG9jayggbHAsICZmbGFncyApOwogICAgICAgIHJldHVybiAxOwogICAgfQoKI2lmZGVmIFVTRV9SVFMKICAgIGlmKCBscC0+dXNlUlRTID09IDEgKSB7CiAgICAgICAgREJHX1BSSU5UKCAiUlRTOiB3ZSdyZSBnZXR0aW5nIGEgVHguLi5cbiIgKTsKCXdsX3VubG9jayggbHAsICZmbGFncyApOwogICAgICAgIHJldHVybiAxOwogICAgfQojZW5kaWYgIC8qIFVTRV9SVFMgKi8KCiAgICBpZiggIWxwLT51c2VfZG1hICkgewogICAgICAgIC8qIEdldCBhbiBlbGVtZW50IGZyb20gdGhlIHF1ZXVlICovCiAgICAgICAgZWxlbWVudCA9IGxwLT50eEZyZWUubmV4dDsKICAgICAgICB0eEYgPSAoV1ZMQU5fTEZSQU1FICopbGlzdF9lbnRyeSggZWxlbWVudCwgV1ZMQU5fTEZSQU1FLCBub2RlICk7CiAgICAgICAgaWYoIHR4RiA9PSBOVUxMICkgewogICAgICAgICAgICBEQkdfRVJST1IoIERiZ0luZm8sICJQcm9ibGVtIHdpdGggbGlzdF9lbnRyeVxuIiApOwoJICAgIHdsX3VubG9jayggbHAsICZmbGFncyApOwogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CiAgICAgICAgLyogRmlsbCBvdXQgdGhlIGZyYW1lICovCiAgICAgICAgdHhGLT5mcmFtZS5za2IgPSBza2I7CiAgICAgICAgdHhGLT5mcmFtZS5wb3J0ID0gcG9ydDsKICAgICAgICAvKiBNb3ZlIHRoZSBmcmFtZSB0byB0aGUgdHhRICovCiAgICAgICAgLyogTk9URTogSGVyZSdzIHdoZXJlIHdlIHdvdWxkIGRvIHByaW9yaXR5IHF1ZXVlaW5nICovCiAgICAgICAgbGlzdF9kZWwoICYoIHR4Ri0+bm9kZSApKTsKICAgICAgICBsaXN0X2FkZCggJiggdHhGLT5ub2RlICksICYoIGxwLT50eFFbMF0gKSk7CgogICAgICAgIGxwLT50eFFfY291bnQrKzsKICAgICAgICBpZiggbHAtPnR4UV9jb3VudCA+PSBERUZBVUxUX05VTV9UWF9GUkFNRVMgKSB7CiAgICAgICAgICAgIERCR19UWCggRGJnSW5mbywgIlEgRnVsbDogJWRcbiIsIGxwLT50eFFfY291bnQgKTsKICAgICAgICAgICAgaWYoIGxwLT5uZXRpZl9xdWV1ZV9vbiA9PSBUUlVFICkgewogICAgICAgICAgICAgICAgbmV0aWZfc3RvcF9xdWV1ZSggbHAtPmRldiApOwogICAgICAgICAgICAgICAgV0xfV0RTX05FVElGX1NUT1BfUVVFVUUoIGxwICk7CiAgICAgICAgICAgICAgICBscC0+bmV0aWZfcXVldWVfb24gPSBGQUxTRTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHdsX2FjdF9pbnRfb2ZmKCBscCApOyAvKiBEaXNhYmxlIEludGVycnVwdHMgKi8KCiAgICAvKiBTZW5kIHRoZSBkYXRhIHRvIHRoZSBoYXJkd2FyZSB1c2luZyB0aGUgYXBwcm9wcmlhdGUgbWV0aG9kICovCiNpZmRlZiBFTkFCTEVfRE1BCiAgICBpZiggbHAtPnVzZV9kbWEgKSB7CiAgICAgICAgd2xfc2VuZF9kbWEoIGxwLCBza2IsIHBvcnQgKTsKICAgIH0KICAgIGVsc2UKI2VuZGlmCiAgICB7CiAgICAgICAgd2xfc2VuZCggbHAgKTsKICAgIH0KICAgIC8qIFJlLWVuYWJsZSBJbnRlcnJ1cHRzLCByZWxlYXNlIHRoZSBzcGlubG9jayBhbmQgcmV0dXJuICovCiAgICB3bF9hY3RfaW50X29uKCBscCApOwogICAgd2xfdW5sb2NrKCBscCwgJmZsYWdzICk7CiAgICByZXR1cm4gMDsKfSAvLyB3bF90eAovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd2xfcngoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgVGhlIHJvdXRpbmUgd2hpY2ggcGVyZm9ybXMgZGF0YSByZWNlcHRpb24uCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIGRldiAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgbmV0X2RldmljZSBzdHJ1Y3R1cmUuCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIDAgb24gc3VjY2VzcwogKiAgICAgIDEgb24gZXJyb3IKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IHdsX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCnsKICAgIGludCAgICAgICAgICAgICAgICAgICAgIHBvcnQ7CiAgICBzdHJ1Y3Qgc2tfYnVmZiAgICAgICAgICAqc2tiOwogICAgc3RydWN0IHdsX3ByaXZhdGUgICAgICAgKmxwID0gd2xfcHJpdihkZXYpOwogICAgaW50ICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwogICAgaGNmXzE2ICAgICAgICAgICAgICAgICAgcGt0bGVuOwogICAgaGNmXzE2ICAgICAgICAgICAgICAgICAgaGZzX3N0YXQ7CiAgICBERVNDX1NUUkNUICAgICAgICAgICAgICAqZGVzYzsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICBEQkdfRlVOQygid2xfcngiKQogICAgREJHX1BBUkFNKERiZ0luZm8sICJkZXYiLCAiJXMgKDB4JXApIiwgZGV2LT5uYW1lLCBkZXYpOwoKICAgIGlmKCEoIGxwLT5mbGFncyAmIFdWTEFOMl9VSUxfQlVTWSApKSB7CgojaWZkZWYgVVNFX1JUUwogICAgICAgIGlmKCBscC0+dXNlUlRTID09IDEgKSB7CiAgICAgICAgICAgIERCR19QUklOVCggIlJUUzogV2UncmUgZ2V0dGluZyBhbiBSeC4uLlxuIiApOwogICAgICAgICAgICByZXR1cm4gLUVJTzsKICAgICAgICB9CiNlbmRpZiAgLyogVVNFX1JUUyAqLwoKICAgICAgICAvKiBSZWFkIHRoZSBIRlNfU1RBVCByZWdpc3RlciBmcm9tIHRoZSBsb29rYWhlYWQgYnVmZmVyICovCiAgICAgICAgaGZzX3N0YXQgPSAoaGNmXzE2KSgoIGxwLT5sb29rQWhlYWRCdWZbSEZTX1NUQVRdICkgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBscC0+bG9va0FoZWFkQnVmW0hGU19TVEFUICsgMV0gPDwgOCApKTsKCiAgICAgICAgLyogTWFrZSBzdXJlIHRoZSBmcmFtZSBpc24ndCBiYWQgKi8KICAgICAgICBpZigoIGhmc19zdGF0ICYgSEZTX1NUQVRfRVJSICkgIT0gSENGX1NVQ0NFU1MgKSB7CiAgICAgICAgICAgIERCR19XQVJOSU5HKCBEYmdJbmZvLCAiSEZTX1NUQVRfRVJST1IgKDB4JXgpIGluIFJ4IFBhY2tldFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGxwLT5sb29rQWhlYWRCdWZbSEZTX1NUQVRdICk7CiAgICAgICAgICAgIHJldHVybiAtRUlPOwogICAgICAgIH0KCiAgICAgICAgLyogRGV0ZXJtaW5lIHdoYXQgcG9ydCB0aGlzIHBhY2tldCBpcyBmb3IgKi8KICAgICAgICBwb3J0ID0gKCBoZnNfc3RhdCA+PiA4ICkgJiAweDAwMDc7CiAgICAgICAgREJHX1JYKCBEYmdJbmZvLCAiUnggZnJhbWUgZm9yIHBvcnQgJWRcbiIsIHBvcnQgKTsKCiAgICAgICAgcGt0bGVuID0gbHAtPmhjZkN0eC5JRkJfUnhMZW47CiAgICAgICAgaWYgKHBrdGxlbiAhPSAwKSB7CiAgICAgICAgICAgIHNrYiA9IEFMTE9DX1NLQihwa3RsZW4pOwogICAgICAgICAgICBpZiAoc2tiICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgIC8qIFNldCB0aGUgbmV0ZGV2IGJhc2VkIG9uIHRoZSBwb3J0ICovCiAgICAgICAgICAgICAgICBzd2l0Y2goIHBvcnQgKSB7CiNpZmRlZiBVU0VfV0RTCiAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgICAgICBjYXNlIDY6CiAgICAgICAgICAgICAgICAgICAgc2tiLT5kZXYgPSBscC0+d2RzX3BvcnRbcG9ydC0xXS5kZXY7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiNlbmRpZiAgLyogVVNFX1dEUyAqLwoKICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgc2tiLT5kZXYgPSBkZXY7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgZGVzYyA9ICYoIGxwLT5kZXNjX3J4ICk7CgogICAgICAgICAgICAgICAgZGVzYy0+bmV4dF9kZXNjX2FkZHIgPSBOVUxMOwoKLyoKI2RlZmluZSBCTE9DS19JTlBVVChidWYsIGxlbikgXAogICAgZGVzYy0+YnVmX2FkZHIgPSBidWY7IFwKICAgIGRlc2MtPkJVRl9TSVpFID0gbGVuOyBcCiAgICBzdGF0dXMgPSBoY2ZfcmN2X21zZygmKGxwLT5oY2ZDdHgpLCBkZXNjLCAwKQoqLwoKICAgICAgICAgICAgICAgIEdFVF9QQUNLRVQoIHNrYi0+ZGV2LCBza2IsIHBrdGxlbiApOwoKICAgICAgICAgICAgICAgIGlmKCBzdGF0dXMgPT0gSENGX1NVQ0NFU1MgKSB7CiAgICAgICAgICAgICAgICAgICAgbmV0aWZfcngoIHNrYiApOwoKICAgICAgICAgICAgICAgICAgICBpZiggcG9ydCA9PSAwICkgewogICAgICAgICAgICAgICAgICAgICAgICBscC0+c3RhdHMucnhfcGFja2V0cysrOwogICAgICAgICAgICAgICAgICAgICAgICBscC0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0bGVuOwogICAgICAgICAgICAgICAgICAgIH0KI2lmZGVmIFVTRV9XRFMKICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBscC0+d2RzX3BvcnRbcG9ydC0xXS5zdGF0cy5yeF9wYWNrZXRzKys7CiAgICAgICAgICAgICAgICAgICAgICAgIGxwLT53ZHNfcG9ydFtwb3J0LTFdLnN0YXRzLnJ4X2J5dGVzICs9IHBrdGxlbjsKICAgICAgICAgICAgICAgICAgICB9CiNlbmRpZiAgLyogVVNFX1dEUyAqLwoKICAgICAgICAgICAgICAgICAgICBkZXYtPmxhc3RfcnggPSBqaWZmaWVzOwoKI2lmZGVmIFdJUkVMRVNTX0VYVAojaWZkZWYgV0lSRUxFU1NfU1BZCiAgICAgICAgICAgICAgICAgICAgaWYoIGxwLT5zcHlkYXRhLnNweV9udW1iZXIgPiAwICkgewogICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpzcmNhZGRyID0gc2tiLT5tYWMucmF3ICsgTUFDX0FERFJfU0laRTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHdsX3NweV9nYXRoZXIoIGRldiwgc3JjYWRkciApOwogICAgICAgICAgICAgICAgICAgIH0KI2VuZGlmIC8qIFdJUkVMRVNTX1NQWSAqLwojZW5kaWYgLyogV0lSRUxFU1NfRVhUICovCiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIERCR19FUlJPUiggRGJnSW5mbywgIlJ4IHJlcXVlc3QgdG8gY2FyZCBGQUlMRURcbiIgKTsKCiAgICAgICAgICAgICAgICAgICAgaWYoIHBvcnQgPT0gMCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKICAgICAgICAgICAgICAgICAgICB9CiNpZmRlZiBVU0VfV0RTCiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbHAtPndkc19wb3J0W3BvcnQtMV0uc3RhdHMucnhfZHJvcHBlZCsrOwogICAgICAgICAgICAgICAgICAgIH0KI2VuZGlmICAvKiBVU0VfV0RTICovCgogICAgICAgICAgICAgICAgICAgIGRldl9rZnJlZV9za2IoIHNrYiApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgREJHX0VSUk9SKCBEYmdJbmZvLCAiQ291bGQgbm90IGFsbG9jIHNrYlxuIiApOwoKICAgICAgICAgICAgICAgIGlmKCBwb3J0ID09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKICAgICAgICAgICAgICAgIH0KI2lmZGVmIFVTRV9XRFMKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBscC0+d2RzX3BvcnRbcG9ydC0xXS5zdGF0cy5yeF9kcm9wcGVkKys7CiAgICAgICAgICAgICAgICB9CiNlbmRpZiAgLyogVVNFX1dEUyAqLwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAwOwp9IC8vIHdsX3J4Ci8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF9tdWx0aWNhc3QoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgRnVuY3Rpb24gdG8gaGFuZGxlIG11bHRpY2FzdCBwYWNrZXRzCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIGRldiAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgbmV0X2RldmljZSBzdHJ1Y3R1cmUuCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIE4vQQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwojaWZkZWYgTkVXX01VTFRJQ0FTVAoKdm9pZCB3bF9tdWx0aWNhc3QoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQp7CiNpZiAxIC8vOz8gKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1NUQSAvLzs/c2hvdWxkIHdlIHJldHVybiBhbiBlcnJvciBzdGF0dXMgaW4gQVAgbW9kZQovLzs/c2VlbXMgcmVhc29uYWJsZSB0aGF0IGV2ZW4gYW4gQVAtb25seSBkcml2ZXIgY291bGQgYWZmb3JkIHRoaXMgc21hbGwgYWRkaXRpb25hbCBmb290cHJpbnQKCiAgICBpbnQgICAgICAgICAgICAgICAgIHg7CiAgICBzdHJ1Y3QgbmV0ZGV2X2h3X2FkZHIgKmhhOwogICAgc3RydWN0IHdsX3ByaXZhdGUgICAqbHAgPSB3bF9wcml2KGRldik7CiAgICB1bnNpZ25lZCBsb25nICAgICAgIGZsYWdzOwogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIERCR19GVU5DKCAid2xfbXVsdGljYXN0IiApOwogICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CiAgICBEQkdfUEFSQU0oIERiZ0luZm8sICJkZXYiLCAiJXMgKDB4JXApIiwgZGV2LT5uYW1lLCBkZXYgKTsKCiAgICBpZiggIXdsX2FkYXB0ZXJfaXNfb3BlbiggZGV2ICkpIHsKICAgICAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKICAgICAgICByZXR1cm47CiAgICB9CgojaWYgREJHCiAgICBpZiggREJHX0ZMQUdTKCBEYmdJbmZvICkgJiBEQkdfUEFSQU1fT04gKSB7CiAgICAgICAgREJHX1BSSU5UKCIgIGZsYWdzOiAlcyVzJXNcbiIsCiAgICAgICAgICAgICggZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDICkgPyAiUHJvbWlzY291cyAiIDogIiIsCiAgICAgICAgICAgICggZGV2LT5mbGFncyAmIElGRl9NVUxUSUNBU1QgKSA/ICJNdWx0aWNhc3QgIiA6ICIiLAogICAgICAgICAgICAoIGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkgKSA/ICJBbGwtTXVsdGljYXN0IiA6ICIiICk7CgogICAgICAgIERCR19QUklOVCggIiAgbWNfY291bnQ6ICVkXG4iLCBuZXRkZXZfbWNfY291bnQoZGV2KSk7CgoJbmV0ZGV2X2Zvcl9lYWNoX21jX2FkZHIoaGEsIGRldikKCURCR19QUklOVCgiICAgICVwTSAoJWQpXG4iLCBoYS0+YWRkciwgZGV2LT5hZGRyX2xlbik7CiAgICB9CiNlbmRpZiAvKiBEQkcgKi8KCiAgICBpZighKCBscC0+ZmxhZ3MgJiBXVkxBTjJfVUlMX0JVU1kgKSkgewoKI2lmZGVmIFVTRV9SVFMKICAgICAgICBpZiggbHAtPnVzZVJUUyA9PSAxICkgewogICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJTa2lwcGluZyBtdWx0aWNhc3QsIGluIFJUUyBtb2RlXG4iICk7CgogICAgICAgICAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KI2VuZGlmICAvKiBVU0VfUlRTICovCgogICAgICAgIHdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKICAgICAgICB3bF9hY3RfaW50X29mZiggbHAgKTsKCgkJaWYgKCBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmhjZkN0eC5JRkJfRldJZGVudGl0eS5jb21wX2lkICkgPT0gQ09NUF9JRF9GV19TVEEgICkgewogICAgICAgICAgICBpZiggZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDICkgewogICAgICAgICAgICAgICAgLyogRW5hYmxlIHByb21pc2N1b3VzIG1vZGUgKi8KICAgICAgICAgICAgICAgIGxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKICAgICAgICAgICAgICAgIGxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX1BST01JU0NVT1VTX01PREU7CiAgICAgICAgICAgICAgICBscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCAxICk7CiAgICAgICAgICAgICAgICBEQkdfUFJJTlQoICJFbmFibGluZyBQcm9taXNjdW91cyBtb2RlIChJRkZfUFJPTUlTQylcbiIgKTsKICAgICAgICAgICAgICAgIGhjZl9wdXRfaW5mbyggJiggbHAtPmhjZkN0eCApLCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKChuZXRkZXZfbWNfY291bnQoZGV2KSA+IEhDRl9NQVhfTVVMVElDQVNUKSB8fAogICAgICAgICAgICAgICAgICAgICggZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSApKSB7CiAgICAgICAgICAgICAgICAvKiBTaHV0dGluZyBvZmYgdGhpcyBmaWx0ZXIgd2lsbCBlbmFibGUgYWxsIG11bHRpY2FzdCBmcmFtZXMgdG8KICAgICAgICAgICAgICAgICAgIGJlIHNlbnQgdXAgZnJvbSB0aGUgZGV2aWNlOyBob3dldmVyLCB0aGlzIGlzIGEgc3RhdGljIFJJRCwgc28KICAgICAgICAgICAgICAgICAgIGEgY2FsbCB0byB3bF9hcHBseSgpIGlzIG5lZWRlZCAqLwogICAgICAgICAgICAgICAgbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOwogICAgICAgICAgICAgICAgbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfQ05GX1JYX0FMTF9HUk9VUF9BRERSOwogICAgICAgICAgICAgICAgbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggMCApOwogICAgICAgICAgICAgICAgREJHX1BSSU5UKCAiRW5hYmxpbmcgYWxsIG11bHRpY2FzdCBtb2RlIChJRkZfQUxMTVVMVEkpXG4iICk7CiAgICAgICAgICAgICAgICBoY2ZfcHV0X2luZm8oICYoIGxwLT5oY2ZDdHggKSwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKICAgICAgICAgICAgICAgIHdsX2FwcGx5KCBscCApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCFuZXRkZXZfbWNfZW1wdHkoZGV2KSkgewogICAgICAgICAgICAgICAgLyogU2V0IHRoZSBtdWx0aWNhc3QgYWRkcmVzc2VzICovCiAgICAgICAgICAgICAgICBscC0+bHR2UmVjb3JkLmxlbiA9ICggbmV0ZGV2X21jX2NvdW50KGRldikgKiAzICkgKyAxOwogICAgICAgICAgICAgICAgbHAtPmx0dlJlY29yZC50eXAgPSBDRkdfR1JPVVBfQUREUjsKCgkJeCA9IDA7CgkJbmV0ZGV2X2Zvcl9lYWNoX21jX2FkZHIoaGEsIGRldikKICAgICAgICAgICAgICAgICAgICBtZW1jcHkoJihscC0+bHR2UmVjb3JkLnUudThbeCsrICogRVRIX0FMRU5dKSwKCQkJICAgaGEtPmFkZHIsIEVUSF9BTEVOKTsKICAgICAgICAgICAgICAgIERCR19QUklOVCggIlNldHRpbmcgbXVsdGljYXN0IGxpc3RcbiIgKTsKICAgICAgICAgICAgICAgIGhjZl9wdXRfaW5mbyggJiggbHAtPmhjZkN0eCApLCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgLyogRGlzYWJsZSBwcm9taXNjdW91cyBtb2RlICovCiAgICAgICAgICAgICAgICBscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CiAgICAgICAgICAgICAgICBscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19QUk9NSVNDVU9VU19NT0RFOwogICAgICAgICAgICAgICAgbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggMCApOwogICAgICAgICAgICAgICAgREJHX1BSSU5UKCAiRGlzYWJsaW5nIFByb21pc2N1b3VzIG1vZGVcbiIgKTsKICAgICAgICAgICAgICAgIGhjZl9wdXRfaW5mbyggJiggbHAtPmhjZkN0eCApLCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOwoKICAgICAgICAgICAgICAgIC8qIERpc2FibGUgbXVsdGljYXN0IG1vZGUgKi8KICAgICAgICAgICAgICAgIGxwLT5sdHZSZWNvcmQubGVuID0gMjsKICAgICAgICAgICAgICAgIGxwLT5sdHZSZWNvcmQudHlwID0gQ0ZHX0dST1VQX0FERFI7CiAgICAgICAgICAgICAgICBEQkdfUFJJTlQoICJEaXNhYmxpbmcgTXVsdGljYXN0IG1vZGVcbiIgKTsKICAgICAgICAgICAgICAgIGhjZl9wdXRfaW5mbyggJiggbHAtPmhjZkN0eCApLCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOwoKICAgICAgICAgICAgICAgIC8qIFR1cm5pbmcgb24gdGhpcyBmaWx0ZXIgd2lsbCBwcmV2ZW50IGFsbCBtdWx0aWNhc3QgZnJhbWVzIGZyb20KICAgICAgICAgICAgICAgICAgIGJlaW5nIHNlbnQgdXAgZnJvbSB0aGUgZGV2aWNlOyBob3dldmVyLCB0aGlzIGlzIGEgc3RhdGljIFJJRCwKICAgICAgICAgICAgICAgICAgIHNvIGEgY2FsbCB0byB3bF9hcHBseSgpIGlzIG5lZWRlZCAqLwogICAgICAgICAgICAgICAgbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOwogICAgICAgICAgICAgICAgbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfQ05GX1JYX0FMTF9HUk9VUF9BRERSOwogICAgICAgICAgICAgICAgbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggMSApOwogICAgICAgICAgICAgICAgREJHX1BSSU5UKCAiRGlzYWJsaW5nIGFsbCBtdWx0aWNhc3QgbW9kZSAoSUZGX0FMTE1VTFRJKVxuIiApOwogICAgICAgICAgICAgICAgaGNmX3B1dF9pbmZvKCAmKCBscC0+aGNmQ3R4ICksIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CiAgICAgICAgICAgICAgICB3bF9hcHBseSggbHAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB3bF9hY3RfaW50X29uKCBscCApOwoJd2xfdW5sb2NrKCBscCwgJmZsYWdzICk7CiAgICB9CiAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKI2VuZGlmIC8qIEhDRl9TVEEgKi8KfSAvLyB3bF9tdWx0aWNhc3QKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCiNlbHNlIC8qIE5FV19NVUxUSUNBU1QgKi8KCnZvaWQgd2xfbXVsdGljYXN0KCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbnVtX2FkZHJzLCB2b2lkICphZGRycyApCnsKICAgIERCR19GVU5DKCAid2xfbXVsdGljYXN0Iik7CiAgICBEQkdfRU5URVIoRGJnSW5mbyk7CgogICAgREJHX1BBUkFNKCBEYmdJbmZvLCAiZGV2IiwgIiVzICgweCVwKSIsIGRldi0+bmFtZSwgZGV2ICk7CiAgICBEQkdfUEFSQU0oIERiZ0luZm8sICJudW1fYWRkcnMiLCAiJWQiLCBudW1fYWRkcnMgKTsKICAgIERCR19QQVJBTSggRGJnSW5mbywgImFkZHJzIiwgIjB4JXAiLCBhZGRycyApOwoKI2Vycm9yIE9ic29sZXRlIHNldCBtdWx0aWNhc3QgaW50ZXJmYWNlIQoKICAgIERCR19MRUFWRSggRGJnSW5mbyApOwp9IC8vIHdsX211bHRpY2FzdAovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKI2VuZGlmIC8qIE5FV19NVUxUSUNBU1QgKi8KCnN0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgd2xfbmV0ZGV2X29wcyA9CnsKICAgIC5uZG9fc3RhcnRfeG1pdCAgICAgICAgID0gJndsX3R4X3BvcnQwLAoKICAgIC5uZG9fc2V0X2NvbmZpZyAgICAgICAgID0gJndsX2NvbmZpZywKICAgIC5uZG9fZ2V0X3N0YXRzICAgICAgICAgID0gJndsX3N0YXRzLAogICAgLm5kb19zZXRfbXVsdGljYXN0X2xpc3QgPSAmd2xfbXVsdGljYXN0LAoKICAgIC5uZG9faW5pdCAgICAgICAgICAgICAgID0gJndsX2luc2VydCwKICAgIC5uZG9fb3BlbiAgICAgICAgICAgICAgID0gJndsX2FkYXB0ZXJfb3BlbiwKICAgIC5uZG9fc3RvcCAgICAgICAgICAgICAgID0gJndsX2FkYXB0ZXJfY2xvc2UsCiAgICAubmRvX2RvX2lvY3RsICAgICAgICAgICA9ICZ3bF9pb2N0bCwKCiAgICAubmRvX3R4X3RpbWVvdXQgICAgICAgICA9ICZ3bF90eF90aW1lb3V0LAoKI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCiAgICAubmRvX3BvbGxfY29udHJvbGxlciAgICA9IHdsX3BvbGwsCiNlbmRpZgp9OwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd2xfZGV2aWNlX2FsbG9jKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIENyZWF0ZSBpbnN0YW5jZXMgb2YgbmV0X2RldmljZSBhbmQgd2xfcHJpdmF0ZSBmb3IgdGhlIG5ldyBhZGFwdGVyCiAqICBhbmQgcmVnaXN0ZXIgdGhlIGRldmljZSdzIGVudHJ5IHBvaW50cyBpbiB0aGUgbmV0X2RldmljZSBzdHJ1Y3R1cmUuCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIE4vQQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBhIHBvaW50ZXIgdG8gYW4gYWxsb2NhdGVkIGFuZCBpbml0aWFsaXplZCBuZXRfZGV2aWNlIHN0cnVjdCBmb3IgdGhpcwogKiAgICAgIGRldmljZS4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RydWN0IG5ldF9kZXZpY2UgKiB3bF9kZXZpY2VfYWxsb2MoIHZvaWQgKQp7CiAgICBzdHJ1Y3QgbmV0X2RldmljZSAgICpkZXYgPSBOVUxMOwogICAgc3RydWN0IHdsX3ByaXZhdGUgICAqbHAgPSBOVUxMOwogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIERCR19GVU5DKCAid2xfZGV2aWNlX2FsbG9jIiApOwogICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CgogICAgLyogQWxsb2MgYSBuZXRfZGV2aWNlIHN0cnVjdCAqLwogICAgZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCB3bF9wcml2YXRlKSk7CiAgICBpZiAoIWRldikKICAgICAgICByZXR1cm4gTlVMTDsKCiAgICAvKiBJbml0aWFsaXplIHRoZSAnbmV4dCcgcG9pbnRlciBpbiB0aGUgc3RydWN0LiBDdXJyZW50bHkgb25seSB1c2VkIGZvciBQQ0ksCiAgICAgICBidXQgZG8gaXQgaGVyZSBqdXN0IGluIGNhc2UgaXQncyB1c2VkIGZvciBvdGhlciBidXNlcyBpbiB0aGUgZnV0dXJlICovCiAgICBscCA9IHdsX3ByaXYoZGV2KTsKCgogICAgLyogQ2hlY2sgTVRVICovCiAgICBpZiggZGV2LT5tdHUgPiBNVFVfTUFYICkKICAgIHsKCSAgICBEQkdfV0FSTklORyggRGJnSW5mbywgIiVzOiBNVFUgc2V0IHRvbyBoaWdoLCBsaW1pdGluZyB0byAlZC5cbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+bmFtZSwgTVRVX01BWCApOwogICAgCWRldi0+bXR1ID0gTVRVX01BWDsKICAgIH0KCiAgICAvKiBTZXR1cCB0aGUgZnVuY3Rpb24gdGFibGUgaW4gdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCgogICAgZGV2LT53aXJlbGVzc19oYW5kbGVycyA9IChzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgKikmd2xfaXdfaGFuZGxlcl9kZWY7CiAgICBscC0+d2lyZWxlc3NfZGF0YS5zcHlfZGF0YSA9ICZscC0+c3B5X2RhdGE7CiAgICBkZXYtPndpcmVsZXNzX2RhdGEgPSAmbHAtPndpcmVsZXNzX2RhdGE7CgogICAgZGV2LT5uZXRkZXZfb3BzID0gJndsX25ldGRldl9vcHM7CgogICAgZGV2LT53YXRjaGRvZ190aW1lbyAgICAgPSBUWF9USU1FT1VUOwoKICAgIGRldi0+ZXRodG9vbF9vcHMJICAgID0gJndsX2V0aHRvb2xfb3BzOwoKICAgIG5ldGlmX3N0b3BfcXVldWUoIGRldiApOwoKICAgIC8qIEFsbG9jYXRlIHZpcnV0YWwgZGV2aWNlcyBmb3IgV0RTIHN1cHBvcnQgaWYgbmVlZGVkICovCiAgICBXTF9XRFNfREVWSUNFX0FMTE9DKCBscCApOwoKICAgIERCR19MRUFWRSggRGJnSW5mbyApOwogICAgcmV0dXJuIGRldjsKfSAvLyB3bF9kZXZpY2VfYWxsb2MKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX2RldmljZV9kZWFsbG9jKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIEZyZWUgaW5zdGFuY2VzIG9mIG5ldF9kZXZpY2UgYW5kIHdsX3ByaXZhdGUgc3RyY3V0cmVzIGZvciBhbiBhZGFwdGVyCiAqICBhbmQgcGVyZm9ybSBiYXNpYyBjbGVhbnVwLgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBkZXYgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIG5ldF9kZXZpY2Ugc3RydWN0dXJlLgogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBOL0EKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCB3bF9kZXZpY2VfZGVhbGxvYyggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCnsKLy8gICAgc3RydWN0IHdsX3ByaXZhdGUgICAqbHAgPSB3bF9wcml2KGRldik7CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgREJHX0ZVTkMoICJ3bF9kZXZpY2VfZGVhbGxvYyIgKTsKICAgIERCR19FTlRFUiggRGJnSW5mbyApOwoKICAgIC8qIERlYWxsb2MgdGhlIFdEUyBwb3J0cyAqLwogICAgV0xfV0RTX0RFVklDRV9ERUFMTE9DKCBscCApOwoKICAgIGZyZWVfbmV0ZGV2KCBkZXYgKTsKCiAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKICAgIHJldHVybjsKfSAvLyB3bF9kZXZpY2VfZGVhbGxvYwovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd2xfdHhfcG9ydDAoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgVGhlIGhhbmRsZXIgcm91dGluZSBmb3IgVHggb3ZlciBIQ0ZfUE9SVF8wLgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBza2IgLSBhIHBvaW50ZXIgdG8gdGhlIHNrX2J1ZmYgdG8gdHJhbnNtaXQuCiAqICAgICAgZGV2IC0gYSBwb2ludGVyIHRvIGEgbmV0X2RldmljZSBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIEhDRl9QT1JUXzAuCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIE4vQQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQgd2xfdHhfcG9ydDAoIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQp7CiAgICBEQkdfVFgoIERiZ0luZm8sICJUeCBvbiBQb3J0IDBcbiIgKTsKCiAgICByZXR1cm4gd2xfdHgoIHNrYiwgZGV2LCBIQ0ZfUE9SVF8wICk7CiNpZmRlZiBFTkFCTEVfRE1BCiAgICByZXR1cm4gd2xfdHhfZG1hKCBza2IsIGRldiwgSENGX1BPUlRfMCApOwojZW5kaWYKfSAvLyB3bF90eF9wb3J0MAovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKI2lmZGVmIFVTRV9XRFMKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX3R4X3BvcnQxKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIFRoZSBoYW5kbGVyIHJvdXRpbmUgZm9yIFR4IG92ZXIgSENGX1BPUlRfMS4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgc2tiIC0gYSBwb2ludGVyIHRvIHRoZSBza19idWZmIHRvIHRyYW5zbWl0LgogKiAgICAgIGRldiAtIGEgcG9pbnRlciB0byBhIG5ldF9kZXZpY2Ugc3RydWN0dXJlIHJlcHJlc2VudGluZyBIQ0ZfUE9SVF8xLgogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBOL0EKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IHdsX3R4X3BvcnQxKCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKewogICAgREJHX1RYKCBEYmdJbmZvLCAiVHggb24gUG9ydCAxXG4iICk7CiAgICByZXR1cm4gd2xfdHgoIHNrYiwgZGV2LCBIQ0ZfUE9SVF8xICk7Cn0gLy8gd2xfdHhfcG9ydDEKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX3R4X3BvcnQyKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIFRoZSBoYW5kbGVyIHJvdXRpbmUgZm9yIFR4IG92ZXIgSENGX1BPUlRfMi4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgc2tiIC0gYSBwb2ludGVyIHRvIHRoZSBza19idWZmIHRvIHRyYW5zbWl0LgogKiAgICAgIGRldiAtIGEgcG9pbnRlciB0byBhIG5ldF9kZXZpY2Ugc3RydWN0dXJlIHJlcHJlc2VudGluZyBIQ0ZfUE9SVF8yLgogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBOL0EKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IHdsX3R4X3BvcnQyKCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKewogICAgREJHX1RYKCBEYmdJbmZvLCAiVHggb24gUG9ydCAyXG4iICk7CiAgICByZXR1cm4gd2xfdHgoIHNrYiwgZGV2LCBIQ0ZfUE9SVF8yICk7Cn0gLy8gd2xfdHhfcG9ydDIKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX3R4X3BvcnQzKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIFRoZSBoYW5kbGVyIHJvdXRpbmUgZm9yIFR4IG92ZXIgSENGX1BPUlRfMy4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgc2tiIC0gYSBwb2ludGVyIHRvIHRoZSBza19idWZmIHRvIHRyYW5zbWl0LgogKiAgICAgIGRldiAtIGEgcG9pbnRlciB0byBhIG5ldF9kZXZpY2Ugc3RydWN0dXJlIHJlcHJlc2VudGluZyBIQ0ZfUE9SVF8zLgogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBOL0EKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IHdsX3R4X3BvcnQzKCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKewogICAgREJHX1RYKCBEYmdJbmZvLCAiVHggb24gUG9ydCAzXG4iICk7CiAgICByZXR1cm4gd2xfdHgoIHNrYiwgZGV2LCBIQ0ZfUE9SVF8zICk7Cn0gLy8gd2xfdHhfcG9ydDMKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX3R4X3BvcnQ0KCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIFRoZSBoYW5kbGVyIHJvdXRpbmUgZm9yIFR4IG92ZXIgSENGX1BPUlRfNC4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgc2tiIC0gYSBwb2ludGVyIHRvIHRoZSBza19idWZmIHRvIHRyYW5zbWl0LgogKiAgICAgIGRldiAtIGEgcG9pbnRlciB0byBhIG5ldF9kZXZpY2Ugc3RydWN0dXJlIHJlcHJlc2VudGluZyBIQ0ZfUE9SVF80LgogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBOL0EKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IHdsX3R4X3BvcnQ0KCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKewogICAgREJHX1RYKCBEYmdJbmZvLCAiVHggb24gUG9ydCA0XG4iICk7CiAgICByZXR1cm4gd2xfdHgoIHNrYiwgZGV2LCBIQ0ZfUE9SVF80ICk7Cn0gLy8gd2xfdHhfcG9ydDQKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX3R4X3BvcnQ1KCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIFRoZSBoYW5kbGVyIHJvdXRpbmUgZm9yIFR4IG92ZXIgSENGX1BPUlRfNS4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgc2tiIC0gYSBwb2ludGVyIHRvIHRoZSBza19idWZmIHRvIHRyYW5zbWl0LgogKiAgICAgIGRldiAtIGEgcG9pbnRlciB0byBhIG5ldF9kZXZpY2Ugc3RydWN0dXJlIHJlcHJlc2VudGluZyBIQ0ZfUE9SVF81LgogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBOL0EKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IHdsX3R4X3BvcnQ1KCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKewogICAgREJHX1RYKCBEYmdJbmZvLCAiVHggb24gUG9ydCA1XG4iICk7CiAgICByZXR1cm4gd2xfdHgoIHNrYiwgZGV2LCBIQ0ZfUE9SVF81ICk7Cn0gLy8gd2xfdHhfcG9ydDUKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX3R4X3BvcnQ2KCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIFRoZSBoYW5kbGVyIHJvdXRpbmUgZm9yIFR4IG92ZXIgSENGX1BPUlRfNi4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgc2tiIC0gYSBwb2ludGVyIHRvIHRoZSBza19idWZmIHRvIHRyYW5zbWl0LgogKiAgICAgIGRldiAtIGEgcG9pbnRlciB0byBhIG5ldF9kZXZpY2Ugc3RydWN0dXJlIHJlcHJlc2VudGluZyBIQ0ZfUE9SVF82LgogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBOL0EKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IHdsX3R4X3BvcnQ2KCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKewogICAgREJHX1RYKCBEYmdJbmZvLCAiVHggb24gUG9ydCA2XG4iICk7CiAgICByZXR1cm4gd2xfdHgoIHNrYiwgZGV2LCBIQ0ZfUE9SVF82ICk7Cn0gLy8gd2xfdHhfcG9ydDYKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX3dkc19kZXZpY2VfYWxsb2MoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgQ3JlYXRlIGluc3RhbmNlcyBvZiBuZXRfZGV2aWNlIHRvIHJlcHJlc2VudCB0aGUgV0RTIHBvcnRzLCBhbmQgcmVnaXN0ZXIKICogIHRoZSBkZXZpY2UncyBlbnRyeSBwb2ludHMgaW4gdGhlIG5ldF9kZXZpY2Ugc3RydWN0dXJlLgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBscCAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgTi9BLCBidXQgd2lsbCBwbGFjZSBwb2ludGVycyB0byB0aGUgYWxsb2NhdGVkIGFuZCBpbml0aWFsaXplZCBuZXRfZGV2aWNlCiAqICAgICAgc3RydWN0cyBpbiB0aGUgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZS4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCB3bF93ZHNfZGV2aWNlX2FsbG9jKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQp7CiAgICBpbnQgY291bnQ7CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgREJHX0ZVTkMoICJ3bF93ZHNfZGV2aWNlX2FsbG9jIiApOwogICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CgogICAgLyogV0RTIHN1cHBvcnQgcmVxdWlyZXMgYWRkaXRpb25hbCBuZXRfZGV2aWNlIHN0cnVjdHMgdG8gYmUgYWxsb2NhdGVkLAogICAgICAgc28gdGhhdCB1c2VyIHNwYWNlIGFwcHMgY2FuIHVzZSB0aGVzZSB2aXJ0dWFsIGRldmljZXMgdG8gc3BlY2lmeSB0aGUKICAgICAgIHBvcnQgb24gd2hpY2ggdG8gVHgvUnggKi8KICAgIGZvciggY291bnQgPSAwOyBjb3VudCA8IE5VTV9XRFNfUE9SVFM7IGNvdW50KysgKSB7CiAgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldl93ZHMgPSBOVUxMOwoKICAgICAgICBkZXZfd2RzID0ga21hbGxvYyggc2l6ZW9mKCBzdHJ1Y3QgbmV0X2RldmljZSApLCBHRlBfS0VSTkVMICk7CiAgICAgICAgbWVtc2V0KCBkZXZfd2RzLCAwLCBzaXplb2YoIHN0cnVjdCBuZXRfZGV2aWNlICkpOwoKICAgICAgICBldGhlcl9zZXR1cCggZGV2X3dkcyApOwoKICAgICAgICBscC0+d2RzX3BvcnRbY291bnRdLmRldiA9IGRldl93ZHM7CgogICAgICAgIC8qIFJlLXVzZSB3bF9pbml0IGZvciBhbGwgdGhlIGRldmljZXMsIGFzIGl0IGN1cnJlbnRseSBkb2VzIG5vdGhpbmcsIGJ1dAogICAgICAgICAgIGlzIHJlcXVpcmVkLiBSZS11c2UgdGhlIHN0YXRzL3R4X3RpbWVvdXQgaGFuZGxlciBmb3IgYWxsIGFzIHdlbGw7IHRoZQogICAgICAgICAgIFdEUyBwb3J0IHdoaWNoIGlzIHJlcXVlc3RpbmcgdGhlc2Ugb3BlcmF0aW9ucyBjYW4gYmUgZGV0ZXJtaW5lZCBieQogICAgICAgICAgIHRoZSBuZXRfZGV2aWNlIHBvaW50ZXIuIFNldCB0aGUgcHJpdmF0ZSBtZW1iZXIgb2YgYWxsIGRldmljZXMgdG8gcG9pbnQKICAgICAgICAgICB0byB0aGUgc2FtZSBuZXRfZGV2aWNlIHN0cnVjdDsgdGhhdCB3YXksIGFsbCBpbmZvcm1hdGlvbiBnZXRzCiAgICAgICAgICAgZnVubmVsbGVkIHRocm91Z2ggdGhlIG9uZSAicmVhbCIgbmV0X2RldmljZS4gTmFtZSB0aGUgV0RTIHBvcnRzCiAgICAgICAgICAgIndkczxuPiIgKi8KICAgICAgICBscC0+d2RzX3BvcnRbY291bnRdLmRldi0+aW5pdCAgICAgICAgICAgPSAmd2xfaW5pdDsKICAgICAgICBscC0+d2RzX3BvcnRbY291bnRdLmRldi0+Z2V0X3N0YXRzICAgICAgPSAmd2xfc3RhdHM7CiAgICAgICAgbHAtPndkc19wb3J0W2NvdW50XS5kZXYtPnR4X3RpbWVvdXQgICAgID0gJndsX3R4X3RpbWVvdXQ7CiAgICAgICAgbHAtPndkc19wb3J0W2NvdW50XS5kZXYtPndhdGNoZG9nX3RpbWVvID0gVFhfVElNRU9VVDsKICAgICAgICBscC0+d2RzX3BvcnRbY291bnRdLmRldi0+cHJpdiAgICAgICAgICAgPSBscDsKCiAgICAgICAgc3ByaW50ZiggbHAtPndkc19wb3J0W2NvdW50XS5kZXYtPm5hbWUsICJ3ZHMlZCIsIGNvdW50ICk7CiAgICB9CgogICAgLyogUmVnaXN0ZXIgdGhlIFR4IGhhbmRsZXJzICovCiAgICBscC0+d2RzX3BvcnRbMF0uZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmd2xfdHhfcG9ydDE7CiAgICBscC0+d2RzX3BvcnRbMV0uZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmd2xfdHhfcG9ydDI7CiAgICBscC0+d2RzX3BvcnRbMl0uZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmd2xfdHhfcG9ydDM7CiAgICBscC0+d2RzX3BvcnRbM10uZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmd2xfdHhfcG9ydDQ7CiAgICBscC0+d2RzX3BvcnRbNF0uZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmd2xfdHhfcG9ydDU7CiAgICBscC0+d2RzX3BvcnRbNV0uZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmd2xfdHhfcG9ydDY7CgogICAgV0xfV0RTX05FVElGX1NUT1BfUVVFVUUoIGxwICk7CgogICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CiAgICByZXR1cm47Cn0gLy8gd2xfd2RzX2RldmljZV9hbGxvYwovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd2xfd2RzX2RldmljZV9kZWFsbG9jKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIEZyZWUgaW5zdGFuY2VzIG9mIG5ldF9kZXZpY2Ugc3RydWN0dXJlcyB1c2VkIHRvIHN1cHBvcnQgV0RTLgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBscCAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgTi9BCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgd2xfd2RzX2RldmljZV9kZWFsbG9jKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQp7CiAgICBpbnQgY291bnQ7CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgREJHX0ZVTkMoICJ3bF93ZHNfZGV2aWNlX2RlYWxsb2MiICk7CiAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKCiAgICBmb3IoIGNvdW50ID0gMDsgY291bnQgPCBOVU1fV0RTX1BPUlRTOyBjb3VudCsrICkgewogICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXZfd2RzID0gTlVMTDsKCiAgICAgICAgZGV2X3dkcyA9IGxwLT53ZHNfcG9ydFtjb3VudF0uZGV2OwoKICAgICAgICBpZiggZGV2X3dkcyAhPSBOVUxMICkgewogICAgICAgICAgICBpZiggZGV2X3dkcy0+ZmxhZ3MgJiBJRkZfVVAgKSB7CiAgICAgICAgICAgICAgICBkZXZfY2xvc2UoIGRldl93ZHMgKTsKICAgICAgICAgICAgICAgIGRldl93ZHMtPmZsYWdzICY9IH4oIElGRl9VUCB8IElGRl9SVU5OSU5HICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZyZWVfbmV0ZGV2KGRldl93ZHMpOwogICAgICAgICAgICBscC0+d2RzX3BvcnRbY291bnRdLmRldiA9IE5VTEw7CiAgICAgICAgfQogICAgfQoKICAgIERCR19MRUFWRSggRGJnSW5mbyApOwogICAgcmV0dXJuOwp9IC8vIHdsX3dkc19kZXZpY2VfZGVhbGxvYwovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd2xfd2RzX25ldGlmX3N0YXJ0X3F1ZXVlKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIFVzZWQgdG8gc3RhcnQgdGhlIG5ldGlmIHF1ZXVlcyBvZiBhbGwgdGhlICJ2aXJ0dWFsIiBuZXR3b3JrIGRldmljZXMKICogICAgICB3aGljaCByZXBlc2VudCB0aGUgV0RTIHBvcnRzLgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBscCAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgTi9BCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgd2xfd2RzX25ldGlmX3N0YXJ0X3F1ZXVlKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQp7CiAgICBpbnQgY291bnQ7CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgaWYoIGxwICE9IE5VTEwgKSB7CiAgICAgICAgZm9yKCBjb3VudCA9IDA7IGNvdW50IDwgTlVNX1dEU19QT1JUUzsgY291bnQrKyApIHsKICAgICAgICAgICAgaWYoIGxwLT53ZHNfcG9ydFtjb3VudF0uaXNfcmVnaXN0ZXJlZCAmJgogICAgICAgICAgICAgICAgbHAtPndkc19wb3J0W2NvdW50XS5uZXRpZl9xdWV1ZV9vbiA9PSBGQUxTRSApIHsKICAgICAgICAgICAgICAgIG5ldGlmX3N0YXJ0X3F1ZXVlKCBscC0+d2RzX3BvcnRbY291bnRdLmRldiApOwogICAgICAgICAgICAgICAgbHAtPndkc19wb3J0W2NvdW50XS5uZXRpZl9xdWV1ZV9vbiA9IFRSVUU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuOwp9IC8vIHdsX3dkc19uZXRpZl9zdGFydF9xdWV1ZQovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd2xfd2RzX25ldGlmX3N0b3BfcXVldWUoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgVXNlZCB0byBzdG9wIHRoZSBuZXRpZiBxdWV1ZXMgb2YgYWxsIHRoZSAidmlydHVhbCIgbmV0d29yayBkZXZpY2VzCiAqICAgICAgd2hpY2ggcmVwZXNlbnQgdGhlIFdEUyBwb3J0cy4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgbHAgIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIE4vQQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIHdsX3dkc19uZXRpZl9zdG9wX3F1ZXVlKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQp7CiAgICBpbnQgY291bnQ7CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgaWYoIGxwICE9IE5VTEwgKSB7CiAgICAgICAgZm9yKCBjb3VudCA9IDA7IGNvdW50IDwgTlVNX1dEU19QT1JUUzsgY291bnQrKyApIHsKICAgICAgICAgICAgaWYoIGxwLT53ZHNfcG9ydFtjb3VudF0uaXNfcmVnaXN0ZXJlZCAmJgogICAgICAgICAgICAgICAgbHAtPndkc19wb3J0W2NvdW50XS5uZXRpZl9xdWV1ZV9vbiA9PSBUUlVFICkgewogICAgICAgICAgICAgICAgbmV0aWZfc3RvcF9xdWV1ZSggbHAtPndkc19wb3J0W2NvdW50XS5kZXYgKTsKICAgICAgICAgICAgICAgIGxwLT53ZHNfcG9ydFtjb3VudF0ubmV0aWZfcXVldWVfb24gPSBGQUxTRTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm47Cn0gLy8gd2xfd2RzX25ldGlmX3N0b3BfcXVldWUKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX3dkc19uZXRpZl93YWtlX3F1ZXVlKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIFVzZWQgdG8gd2FrZSB0aGUgbmV0aWYgcXVldWVzIG9mIGFsbCB0aGUgInZpcnR1YWwiIG5ldHdvcmsgZGV2aWNlcwogKiAgICAgIHdoaWNoIHJlcGVzZW50IHRoZSBXRFMgcG9ydHMuCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIGxwICAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBOL0EKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCB3bF93ZHNfbmV0aWZfd2FrZV9xdWV1ZSggc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKewogICAgaW50IGNvdW50OwogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIGlmKCBscCAhPSBOVUxMICkgewogICAgICAgIGZvciggY291bnQgPSAwOyBjb3VudCA8IE5VTV9XRFNfUE9SVFM7IGNvdW50KysgKSB7CiAgICAgICAgICAgIGlmKCBscC0+d2RzX3BvcnRbY291bnRdLmlzX3JlZ2lzdGVyZWQgJiYKICAgICAgICAgICAgICAgIGxwLT53ZHNfcG9ydFtjb3VudF0ubmV0aWZfcXVldWVfb24gPT0gRkFMU0UgKSB7CiAgICAgICAgICAgICAgICBuZXRpZl93YWtlX3F1ZXVlKCBscC0+d2RzX3BvcnRbY291bnRdLmRldiApOwogICAgICAgICAgICAgICAgbHAtPndkc19wb3J0W2NvdW50XS5uZXRpZl9xdWV1ZV9vbiA9IFRSVUU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuOwp9IC8vIHdsX3dkc19uZXRpZl93YWtlX3F1ZXVlCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF93ZHNfbmV0aWZfY2Fycmllcl9vbigpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBVc2VkIHRvIHNpZ25hbCB0aGUgbmV0d29yayBsYXllciB0aGF0IGNhcnJpZXIgaXMgcHJlc2VudCBvbiBhbGwgb2YgdGhlCiAqICAgICAgInZpcnR1YWwiIG5ldHdvcmsgZGV2aWNlcyB3aGljaCByZXBlc2VudCB0aGUgV0RTIHBvcnRzLgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBscCAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgTi9BCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgd2xfd2RzX25ldGlmX2NhcnJpZXJfb24oIHN0cnVjdCB3bF9wcml2YXRlICpscCApCnsKICAgIGludCBjb3VudDsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICBpZiggbHAgIT0gTlVMTCApIHsKICAgICAgICBmb3IoIGNvdW50ID0gMDsgY291bnQgPCBOVU1fV0RTX1BPUlRTOyBjb3VudCsrICkgewogICAgICAgICAgICBpZiggbHAtPndkc19wb3J0W2NvdW50XS5pc19yZWdpc3RlcmVkICkgewogICAgICAgICAgICAgICAgbmV0aWZfY2Fycmllcl9vbiggbHAtPndkc19wb3J0W2NvdW50XS5kZXYgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm47Cn0gLy8gd2xfd2RzX25ldGlmX2NhcnJpZXJfb24KLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX3dkc19uZXRpZl9jYXJyaWVyX29mZigpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBVc2VkIHRvIHNpZ25hbCB0aGUgbmV0d29yayBsYXllciB0aGF0IGNhcnJpZXIgaXMgTk9UIHByZXNlbnQgb24gYWxsIG9mCiAqICAgICAgdGhlICJ2aXJ0dWFsIiBuZXR3b3JrIGRldmljZXMgd2hpY2ggcmVwZXNlbnQgdGhlIFdEUyBwb3J0cy4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgbHAgIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIE4vQQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIHdsX3dkc19uZXRpZl9jYXJyaWVyX29mZiggc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKewogICAgaW50IGNvdW50OwogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIGlmKCBscCAhPSBOVUxMICkgewogICAgICAgIGZvciggY291bnQgPSAwOyBjb3VudCA8IE5VTV9XRFNfUE9SVFM7IGNvdW50KysgKSB7CiAgICAgICAgICAgIGlmKCBscC0+d2RzX3BvcnRbY291bnRdLmlzX3JlZ2lzdGVyZWQgKSB7CiAgICAgICAgICAgICAgICBuZXRpZl9jYXJyaWVyX29mZiggbHAtPndkc19wb3J0W2NvdW50XS5kZXYgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm47Cn0gLy8gd2xfd2RzX25ldGlmX2NhcnJpZXJfb2ZmCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgojZW5kaWYgIC8qIFVTRV9XRFMgKi8KCiNpZmRlZiBFTkFCTEVfRE1BCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX3NlbmRfZG1hKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIFRoZSByb3V0aW5lIHdoaWNoIHBlcmZvcm1zIGRhdGEgdHJhbnNtaXRzIHdoZW4gdXNpbmcgYnVzbWFzdGVyIERNQS4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgbHAgICAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3Mgd2xfcHJpdmF0ZSBzdHJ1Y3QuCiAqICAgICAgc2tiICAtIGEgcG9pbnRlciB0byB0aGUgbmV0d29yayBsYXllcidzIGRhdGEgYnVmZmVyLgogKiAgICAgIHBvcnQgLSB0aGUgSGVybWVzIHBvcnQgb24gd2hpY2ggdG8gdHJhbnNtaXQuCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIDAgb24gc3VjY2VzcwogKiAgICAgIDEgb24gZXJyb3IKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IHdsX3NlbmRfZG1hKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAsIHN0cnVjdCBza19idWZmICpza2IsIGludCBwb3J0ICkKewogICAgaW50ICAgICAgICAgbGVuOwogICAgREVTQ19TVFJDVCAqZGVzYyA9IE5VTEw7CiAgICBERVNDX1NUUkNUICpkZXNjX25leHQgPSBOVUxMOwogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIERCR19GVU5DKCAid2xfc2VuZF9kbWEiICk7CgogICAgaWYoIGxwID09IE5VTEwgKQogICAgewogICAgICAgIERCR19FUlJPUiggRGJnSW5mbywgIlByaXZhdGUgYWRhcHRlciBzdHJ1Y3QgaXMgTlVMTFxuIiApOwogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KCiAgICBpZiggbHAtPmRldiA9PSBOVUxMICkKICAgIHsKICAgICAgICBEQkdfRVJST1IoIERiZ0luZm8sICJuZXRfZGV2aWNlIHN0cnVjdCBpbiB3bF9wcml2YXRlIGlzIE5VTExcbiIgKTsKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9CgogICAgLyogQUdBSU4sIEFMTCBUSEUgUVVFVUVJTkcgRE9ORSBIRVJFIElOIEkvTyBNT0RFIElTIE5PVCBQRVJGT1JNRUQgKi8KCiAgICBpZiggc2tiID09IE5VTEwgKQogICAgewogICAgICAgIERCR19XQVJOSU5HIChEYmdJbmZvLCAiTm90aGluZyB0byBzZW5kLlxuIik7CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQoKICAgIGxlbiA9IHNrYi0+bGVuOwoKICAgIC8qIEdldCBhIGZyZWUgZGVzY3JpcHRvciAqLwogICAgZGVzYyA9IHdsX3BjaV9kbWFfZ2V0X3R4X3BhY2tldCggbHAgKTsKCiAgICBpZiggZGVzYyA9PSBOVUxMICkKICAgIHsKICAgICAgICBpZiggbHAtPm5ldGlmX3F1ZXVlX29uID09IFRSVUUgKSB7CiAgICAgICAgICAgIG5ldGlmX3N0b3BfcXVldWUoIGxwLT5kZXYgKTsKICAgICAgICAgICAgV0xfV0RTX05FVElGX1NUT1BfUVVFVUUoIGxwICk7CiAgICAgICAgICAgIGxwLT5uZXRpZl9xdWV1ZV9vbiA9IEZBTFNFOwoKICAgICAgICAgICAgZGV2X2tmcmVlX3NrYiggc2tiICk7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KCiAgICBTRVRfQlVGX0NOVCggZGVzYywgLypIQ0ZfRE1BX0ZEX0NOVCovSEZTX0FERFJfREVTVCApOwogICAgU0VUX0JVRl9TSVpFKCBkZXNjLCBIQ0ZfRE1BX1RYX0JVRjFfU0laRSApOwoKICAgIGRlc2NfbmV4dCA9IGRlc2MtPm5leHRfZGVzY19hZGRyOwoKICAgIGlmKCBkZXNjX25leHQtPmJ1Zl9hZGRyID09IE5VTEwgKQogICAgewogICAgICAgIERCR19FUlJPUiggRGJnSW5mbywgIkRNQSBkZXNjcmlwdG9yIGJ1Zl9hZGRyIGlzIE5VTExcbiIgKTsKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9CgogICAgLyogQ29weSB0aGUgcGF5bG9hZCBpbnRvIHRoZSBETUEgcGFja2V0ICovCiAgICBtZW1jcHkoIGRlc2NfbmV4dC0+YnVmX2FkZHIsIHNrYi0+ZGF0YSwgbGVuICk7CgogICAgU0VUX0JVRl9DTlQoIGRlc2NfbmV4dCwgbGVuICk7CiAgICBTRVRfQlVGX1NJWkUoIGRlc2NfbmV4dCwgSENGX01BWF9QQUNLRVRfU0laRSApOwoKICAgIGhjZl9kbWFfdHhfcHV0KCAmKCBscC0+aGNmQ3R4ICksIGRlc2MsIDAgKTsKCiAgICAvKiBGcmVlIHRoZSBza2IgYW5kIHBlcmZvcm0gcXVldWUgY2xlYW51cCwgYXMgdGhlIGJ1ZmZlciB3YXMKICAgICAgICAgICAgdHJhbnNtaXR0ZWQgc3VjY2Vzc2Z1bGx5ICovCiAgICBkZXZfa2ZyZWVfc2tiKCBza2IgKTsKCiAgICByZXR1cm4gVFJVRTsKfSAvLyB3bF9zZW5kX2RtYQovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd2xfcnhfZG1hKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIFRoZSByb3V0aW5lIHdoaWNoIHBlcmZvcm1zIGRhdGEgcmVjZXB0aW9uIHdoZW4gdXNpbmcgYnVzbWFzdGVyIERNQS4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgZGV2IC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBuZXRfZGV2aWNlIHN0cnVjdHVyZS4KICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgMCBvbiBzdWNjZXNzCiAqICAgICAgMSBvbiBlcnJvcgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQgd2xfcnhfZG1hKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKewogICAgaW50ICAgICAgICAgICAgICAgICAgICAgIHBvcnQ7CiAgICBoY2ZfMTYgICAgICAgICAgICAgICAgICAgcGt0bGVuOwogICAgaGNmXzE2ICAgICAgICAgICAgICAgICAgIGhmc19zdGF0OwogICAgc3RydWN0IHNrX2J1ZmYgICAgICAgICAgKnNrYjsKICAgIHN0cnVjdCB3bF9wcml2YXRlICAgICAgICpscCA9IE5VTEw7CiAgICBERVNDX1NUUkNUICAgICAgICAgICAgICAqZGVzYywgKmRlc2NfbmV4dDsKICAgIC8vQ0ZHX01CX0lORk9fUkFOR0UyX1NUUkNUIHg7CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgREJHX0ZVTkMoIndsX3J4IikKICAgIERCR19QQVJBTShEYmdJbmZvLCAiZGV2IiwgIiVzICgweCVwKSIsIGRldi0+bmFtZSwgZGV2KTsKCiAgICBpZigoKCBscCA9IGRldi0+cHJpdiApICE9IE5VTEwgKSAmJgoJISggbHAtPmZsYWdzICYgV1ZMQU4yX1VJTF9CVVNZICkpIHsKCiNpZmRlZiBVU0VfUlRTCiAgICAgICAgaWYoIGxwLT51c2VSVFMgPT0gMSApIHsKICAgICAgICAgICAgREJHX1BSSU5UKCAiUlRTOiBXZSdyZSBnZXR0aW5nIGFuIFJ4Li4uXG4iICk7CiAgICAgICAgICAgIHJldHVybiAtRUlPOwogICAgICAgIH0KI2VuZGlmICAvKiBVU0VfUlRTICovCgogICAgICAgIC8vaWYoIGxwLT5kbWEuc3RhdHVzID09IDAgKQogICAgICAgIC8vewogICAgICAgICAgICBkZXNjID0gaGNmX2RtYV9yeF9nZXQoICYoIGxwLT5oY2ZDdHggKSk7CgogICAgICAgICAgICBpZiggZGVzYyAhPSBOVUxMICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLyogQ2hlY2sgYW5kIHNlZSBpZiB3ZSByY3ZkLiBhIFdNUCBmcmFtZSAqLwogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgIGlmKCgoICooaGNmXzggKikmZGVzYy0+YnVmX2FkZHJbSEZTX1NUQVRdICkgJgogICAgICAgICAgICAgICAgICAgICggSEZTX1NUQVRfTVNHX1RZUEUgfCBIRlNfU1RBVF9FUlIgKSkgPT0gSEZTX1NUQVRfV01QX01TRyApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiR290IGEgV01QIGZyYW1lXG4iICk7CgogICAgICAgICAgICAgICAgICAgIHgubGVuID0gc2l6ZW9mKCBDRkdfTUJfSU5GT19SQU5HRTJfU1RSQ1QgKSAvIHNpemVvZiggaGNmXzE2ICk7CgkJCQkgICAgeC50eXAgPSBDRkdfTUJfSU5GTzsKCQkJCSAgICB4LmJhc2VfdHlwID0gQ0ZHX1dNUDsKCQkJCSAgICB4LmZyYWdfY250ID0gMjsKCQkJCSAgICB4LmZyYWdfYnVmWzBdLmZyYWdfbGVuICA9IEdFVF9CVUZfQ05UKCBkZXNjcCApIC8gc2l6ZW9mKCBoY2ZfMTYgKTsKCQkJCSAgICB4LmZyYWdfYnVmWzBdLmZyYWdfYWRkciA9IChoY2ZfOCAqKSBkZXNjcC0+YnVmX2FkZHIgOwoJCQkJICAgIHguZnJhZ19idWZbMV0uZnJhZ19sZW4gID0gKCBHRVRfQlVGX0NOVCggZGVzY3AtPm5leHRfZGVzY19hZGRyICkgKyAxICkgLyBzaXplb2YoIGhjZl8xNiApOwoJCQkJICAgIHguZnJhZ19idWZbMV0uZnJhZ19hZGRyID0gKGhjZl84ICopIGRlc2NwLT5uZXh0X2Rlc2NfYWRkci0+YnVmX2FkZHIgOwoKICAgICAgICAgICAgICAgICAgICBoY2ZfcHV0X2luZm8oICYoIGxwLT5oY2ZDdHggKSwgKExUVlApJnggKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICovCgogICAgICAgICAgICAgICAgZGVzY19uZXh0ID0gZGVzYy0+bmV4dF9kZXNjX2FkZHI7CgogICAgICAgICAgICAgICAgLyogTWFrZSBzdXJlIHRoZSBidWZmZXIgaXNuJ3QgZW1wdHkgKi8KICAgICAgICAgICAgICAgIGlmKCBHRVRfQlVGX0NOVCggZGVzYyApID09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgREJHX1dBUk5JTkcoIERiZ0luZm8sICJCdWZmZXIgaXMgZW1wdHkhXG4iICk7CgogICAgICAgICAgICAgICAgICAgIC8qIEdpdmUgdGhlIGRlc2NyaXB0b3IgYmFjayB0byB0aGUgSENGICovCiAgICAgICAgICAgICAgICAgICAgaGNmX2RtYV9yeF9wdXQoICYoIGxwLT5oY2ZDdHggKSwgZGVzYyApOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlPOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8qIFJlYWQgdGhlIEhGU19TVEFUIHJlZ2lzdGVyIGZyb20gdGhlIGxvb2thaGVhZCBidWZmZXIgKi8KICAgICAgICAgICAgICAgIGhmc19zdGF0ID0gKGhjZl8xNikoIGRlc2MtPmJ1Zl9hZGRyW0hGU19TVEFULzJdICk7CgogICAgICAgICAgICAgICAgLyogTWFrZSBzdXJlIHRoZSBmcmFtZSBpc24ndCBiYWQgKi8KICAgICAgICAgICAgICAgIGlmKCggaGZzX3N0YXQgJiBIRlNfU1RBVF9FUlIgKSAhPSBIQ0ZfU1VDQ0VTUyApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgREJHX1dBUk5JTkcoIERiZ0luZm8sICJIRlNfU1RBVF9FUlJPUiAoMHgleCkgaW4gUnggUGFja2V0XG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPmJ1Zl9hZGRyW0hGU19TVEFULzJdICk7CgogICAgICAgICAgICAgICAgICAgIC8qIEdpdmUgdGhlIGRlc2NyaXB0b3IgYmFjayB0byB0aGUgSENGICovCiAgICAgICAgICAgICAgICAgICAgaGNmX2RtYV9yeF9wdXQoICYoIGxwLT5oY2ZDdHggKSwgZGVzYyApOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlPOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8qIERldGVybWluZSB3aGF0IHBvcnQgdGhpcyBwYWNrZXQgaXMgZm9yICovCiAgICAgICAgICAgICAgICBwb3J0ID0gKCBoZnNfc3RhdCA+PiA4ICkgJiAweDAwMDc7CiAgICAgICAgICAgICAgICBEQkdfUlgoIERiZ0luZm8sICJSeCBmcmFtZSBmb3IgcG9ydCAlZFxuIiwgcG9ydCApOwoKICAgICAgICAgICAgICAgIHBrdGxlbiA9IEdFVF9CVUZfQ05UKGRlc2NfbmV4dCk7CiAgICAgICAgICAgICAgICBpZiAocGt0bGVuICE9IDApIHsKICAgICAgICAgICAgICAgICAgICBza2IgPSBBTExPQ19TS0IocGt0bGVuKTsKICAgICAgICAgICAgICAgICAgICBpZiAoc2tiICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKCBwb3J0ICkgewojaWZkZWYgVVNFX1dEUwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tiLT5kZXYgPSBscC0+d2RzX3BvcnRbcG9ydC0xXS5kZXY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKI2VuZGlmICAvKiBVU0VfV0RTICovCgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2ItPmRldiA9IGRldjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBHRVRfUEFDS0VUX0RNQSggc2tiLT5kZXYsIHNrYiwgcGt0bGVuICk7CgogICAgICAgICAgICAgICAgICAgICAgICAvKiBHaXZlIHRoZSBkZXNjcmlwdG9yIGJhY2sgdG8gdGhlIEhDRiAqLwogICAgICAgICAgICAgICAgICAgICAgICBoY2ZfZG1hX3J4X3B1dCggJiggbHAtPmhjZkN0eCApLCBkZXNjICk7CgogICAgICAgICAgICAgICAgICAgICAgICBuZXRpZl9yeCggc2tiICk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiggcG9ydCA9PSAwICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwLT5zdGF0cy5yeF9ieXRlcyArPSBwa3RsZW47CiAgICAgICAgICAgICAgICAgICAgICAgIH0KI2lmZGVmIFVTRV9XRFMKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBscC0+d2RzX3BvcnRbcG9ydC0xXS5zdGF0cy5yeF9wYWNrZXRzKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBscC0+d2RzX3BvcnRbcG9ydC0xXS5zdGF0cy5yeF9ieXRlcyArPSBwa3RsZW47CiAgICAgICAgICAgICAgICAgICAgICAgIH0KI2VuZGlmICAvKiBVU0VfV0RTICovCgogICAgICAgICAgICAgICAgICAgICAgICBkZXYtPmxhc3RfcnggPSBqaWZmaWVzOwoKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBEQkdfRVJST1IoIERiZ0luZm8sICJDb3VsZCBub3QgYWxsb2Mgc2tiXG4iICk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiggcG9ydCA9PSAwICkKCSAgICAgICAgICAgICAgICAgICAgewoJICAgICAgICAgICAgICAgICAgICAgICAgbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKCSAgICAgICAgICAgICAgICAgICAgfQojaWZkZWYgVVNFX1dEUwogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwLT53ZHNfcG9ydFtwb3J0LTFdLnN0YXRzLnJ4X2Ryb3BwZWQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgfQojZW5kaWYgIC8qIFVTRV9XRFMgKi8KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAvL30KICAgIH0KCiAgICByZXR1cm4gMDsKfSAvLyB3bF9yeF9kbWEKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KI2VuZGlmICAvLyBFTkFCTEVfRE1BCg==