LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiBpMmMtZWxla3Rvci5jIGkyYy1odyBhY2Nlc3MgZm9yIFBDRjg1ODQgc3R5bGUgaXNhIGJ1cyBhZGFwdGVzICAgICAgICAgICAgICovCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogICBDb3B5cmlnaHQgKEMpIDE5OTUtOTcgU2ltb24gRy4gVm9nbAogICAgICAgICAgICAgICAgICAgMTk5OC05OSBIYW5zIEJlcmdsdW5kCgogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCQkgICAgICovCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCi8qIFdpdGggc29tZSBjaGFuZ2VzIGZyb20gS3n2c3RpIE3kbGtraSA8a21hbGtraUBjYy5odXQuZmk+IGFuZCBldmVuCiAgIEZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4gKi8KCi8qIFBhcnRpYWx5IHJld3JpdGVuIGJ5IE9sZWcgSS4gVmRvdmlraW4gZm9yIG1tYXBwZWQgc3VwcG9ydCBvZgogICBmb3IgQWxwaGEgUHJvY2Vzc29yIEluYy4gVVAtMjAwMCgrKSBib2FyZHMgKi8KCiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgojaW5jbHVkZSA8bGludXgvc2xhYi5oPgojaW5jbHVkZSA8bGludXgvaW5pdC5oPgojaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiNpbmNsdWRlIDxsaW51eC9wY2kuaD4KI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KCiNpbmNsdWRlIDxsaW51eC9pc2EuaD4KI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgojaW5jbHVkZSA8bGludXgvaTJjLWFsZ28tcGNmLmg+CgojaW5jbHVkZSA8YXNtL2lvLmg+CiNpbmNsdWRlIDxhc20vaXJxLmg+CgojaW5jbHVkZSAiLi4vYWxnb3MvaTJjLWFsZ28tcGNmLmgiCgojZGVmaW5lIERFRkFVTFRfQkFTRSAweDMzMAoKc3RhdGljIGludCBiYXNlOwpzdGF0aWMgdTggX19pb21lbSAqYmFzZV9pb21lbTsKCnN0YXRpYyBpbnQgaXJxOwpzdGF0aWMgaW50IGNsb2NrICA9IDB4MWM7CnN0YXRpYyBpbnQgb3duICAgID0gMHg1NTsKc3RhdGljIGludCBtbWFwcGVkOwoKLyogdmRvdmlraW46IHJlbW92ZWQgc3RhdGljIHN0cnVjdCBpMmNfcGNmX2lzYSBncGk7IGNvZGUgLQogIHRoaXMgbW9kdWxlIGluIHJlYWwgc3VwcG9ydHMgb25seSBvbmUgZGV2aWNlLCBkdWUgdG8gbWlzc2luZyBhcmd1bWVudHMKICBpbiBzb21lIGZ1bmN0aW9ucywgY2FsbGVkIGZyb20gdGhlIGFsZ28tcGNmIG1vZHVsZS4gU29tZXRpbWVzIGl0J3MKICBuZWVkIHRvIGJlIHJld3JpdGVuIC0gYnV0IGZvciBub3cganVzdCByZW1vdmUgdGhpcyBmb3Igc2ltcGxlciByZWFkaW5nICovCgpzdGF0aWMgd2FpdF9xdWV1ZV9oZWFkX3QgcGNmX3dhaXQ7CnN0YXRpYyBpbnQgcGNmX3BlbmRpbmc7CnN0YXRpYyBzcGlubG9ja190IGxvY2s7CgpzdGF0aWMgc3RydWN0IGkyY19hZGFwdGVyIHBjZl9pc2Ffb3BzOwoKLyogLS0tLS0gbG9jYWwgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0JKi8KCnN0YXRpYyB2b2lkIHBjZl9pc2Ffc2V0Ynl0ZSh2b2lkICpkYXRhLCBpbnQgY3RsLCBpbnQgdmFsKQp7Cgl1OCBfX2lvbWVtICphZGRyZXNzID0gY3RsID8gKGJhc2VfaW9tZW0gKyAxKSA6IGJhc2VfaW9tZW07CgoJLyogZW5hYmxlIGlycSBpZiBhbnkgc3BlY2lmaWVkIGZvciBzZXJpYWwgb3BlcmF0aW9uICovCglpZiAoY3RsICYmIGlycSAmJiAodmFsICYgSTJDX1BDRl9FU08pKSB7CgkJdmFsIHw9IEkyQ19QQ0ZfRU5JOwoJfQoKCXByX2RlYnVnKCIlczogV3JpdGUgJXAgMHglMDJYXG4iLCBwY2ZfaXNhX29wcy5uYW1lLCBhZGRyZXNzLCB2YWwpOwoJaW93cml0ZTgodmFsLCBhZGRyZXNzKTsKI2lmZGVmIF9fYWxwaGFfXwoJLyogQVBJIFVQMjAwMCBuZWVkcyBzb21lIGhhcmR3YXJlIGZ1ZGdpbmcgdG8gbWFrZSB0aGUgd3JpdGUgc3RpY2sgKi8KCWlvd3JpdGU4KHZhbCwgYWRkcmVzcyk7CiNlbmRpZgp9CgpzdGF0aWMgaW50IHBjZl9pc2FfZ2V0Ynl0ZSh2b2lkICpkYXRhLCBpbnQgY3RsKQp7Cgl1OCBfX2lvbWVtICphZGRyZXNzID0gY3RsID8gKGJhc2VfaW9tZW0gKyAxKSA6IGJhc2VfaW9tZW07CglpbnQgdmFsID0gaW9yZWFkOChhZGRyZXNzKTsKCglwcl9kZWJ1ZygiJXM6IFJlYWQgJXAgMHglMDJYXG4iLCBwY2ZfaXNhX29wcy5uYW1lLCBhZGRyZXNzLCB2YWwpOwoJcmV0dXJuICh2YWwpOwp9CgpzdGF0aWMgaW50IHBjZl9pc2FfZ2V0b3duKHZvaWQgKmRhdGEpCnsKCXJldHVybiAob3duKTsKfQoKCnN0YXRpYyBpbnQgcGNmX2lzYV9nZXRjbG9jayh2b2lkICpkYXRhKQp7CglyZXR1cm4gKGNsb2NrKTsKfQoKc3RhdGljIHZvaWQgcGNmX2lzYV93YWl0Zm9ycGluKHZvaWQpIHsKCURFRklORV9XQUlUKHdhaXQpOwoJaW50IHRpbWVvdXQgPSAyOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCglpZiAoaXJxID4gMCkgewoJCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NrLCBmbGFncyk7CgkJaWYgKHBjZl9wZW5kaW5nID09IDApIHsKCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jaywgZmxhZ3MpOwoJCQlwcmVwYXJlX3RvX3dhaXQoJnBjZl93YWl0LCAmd2FpdCwgVEFTS19JTlRFUlJVUFRJQkxFKTsKCQkJaWYgKHNjaGVkdWxlX3RpbWVvdXQodGltZW91dCpIWikpIHsKCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NrLCBmbGFncyk7CgkJCQlpZiAocGNmX3BlbmRpbmcgPT0gMSkgewoJCQkJCXBjZl9wZW5kaW5nID0gMDsKCQkJCX0KCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2ssIGZsYWdzKTsKCQkJfQoJCQlmaW5pc2hfd2FpdCgmcGNmX3dhaXQsICZ3YWl0KTsKCQl9IGVsc2UgewoJCQlwY2ZfcGVuZGluZyA9IDA7CgkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2ssIGZsYWdzKTsKCQl9Cgl9IGVsc2UgewoJCXVkZWxheSgxMDApOwoJfQp9CgoKc3RhdGljIGlycXJldHVybl90IHBjZl9pc2FfaGFuZGxlcihpbnQgdGhpc19pcnEsIHZvaWQgKmRldl9pZCkgewoJc3Bpbl9sb2NrKCZsb2NrKTsKCXBjZl9wZW5kaW5nID0gMTsKCXNwaW5fdW5sb2NrKCZsb2NrKTsKCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcGNmX3dhaXQpOwoJcmV0dXJuIElSUV9IQU5ETEVEOwp9CgoKc3RhdGljIGludCBwY2ZfaXNhX2luaXQodm9pZCkKewoJc3Bpbl9sb2NrX2luaXQoJmxvY2spOwoJaWYgKCFtbWFwcGVkKSB7CgkJaWYgKCFyZXF1ZXN0X3JlZ2lvbihiYXNlLCAyLCBwY2ZfaXNhX29wcy5uYW1lKSkgewoJCQlwcmludGsoS0VSTl9FUlIgIiVzOiByZXF1ZXN0ZWQgSS9PIHJlZ2lvbiAoJSN4OjIpIGlzICIKCQkJICAgICAgICJpbiB1c2VcbiIsIHBjZl9pc2Ffb3BzLm5hbWUsIGJhc2UpOwoJCQlyZXR1cm4gLUVOT0RFVjsKCQl9CgkJYmFzZV9pb21lbSA9IGlvcG9ydF9tYXAoYmFzZSwgMik7CgkJaWYgKCFiYXNlX2lvbWVtKSB7CgkJCXByaW50ayhLRVJOX0VSUiAiJXM6IHJlbWFwIG9mIEkvTyByZWdpb24gJSN4IGZhaWxlZFxuIiwKCQkJICAgICAgIHBjZl9pc2Ffb3BzLm5hbWUsIGJhc2UpOwoJCQlyZWxlYXNlX3JlZ2lvbihiYXNlLCAyKTsKCQkJcmV0dXJuIC1FTk9ERVY7CgkJfQoJfSBlbHNlIHsKCQlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihiYXNlLCAyLCBwY2ZfaXNhX29wcy5uYW1lKSkgewoJCQlwcmludGsoS0VSTl9FUlIgIiVzOiByZXF1ZXN0ZWQgbWVtb3J5IHJlZ2lvbiAoJSN4OjIpICIKCQkJICAgICAgICJpcyBpbiB1c2VcbiIsIHBjZl9pc2Ffb3BzLm5hbWUsIGJhc2UpOwoJCQlyZXR1cm4gLUVOT0RFVjsKCQl9CgkJYmFzZV9pb21lbSA9IGlvcmVtYXAoYmFzZSwgMik7CgkJaWYgKGJhc2VfaW9tZW0gPT0gTlVMTCkgewoJCQlwcmludGsoS0VSTl9FUlIgIiVzOiByZW1hcCBvZiBtZW1vcnkgcmVnaW9uICUjeCAiCgkJCSAgICAgICAiZmFpbGVkXG4iLCBwY2ZfaXNhX29wcy5uYW1lLCBiYXNlKTsKCQkJcmVsZWFzZV9tZW1fcmVnaW9uKGJhc2UsIDIpOwoJCQlyZXR1cm4gLUVOT0RFVjsKCQl9Cgl9Cglwcl9kZWJ1ZygiJXM6IHJlZ2lzdGVycyAlI3ggcmVtYXBwZWQgdG8gJXBcbiIsIHBjZl9pc2Ffb3BzLm5hbWUsIGJhc2UsCgkJIGJhc2VfaW9tZW0pOwoKCWlmIChpcnEgPiAwKSB7CgkJaWYgKHJlcXVlc3RfaXJxKGlycSwgcGNmX2lzYV9oYW5kbGVyLCAwLCBwY2ZfaXNhX29wcy5uYW1lLAoJCQkJTlVMTCkgPCAwKSB7CgkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFJlcXVlc3QgaXJxJWQgZmFpbGVkXG4iLAoJCQkgICAgICAgcGNmX2lzYV9vcHMubmFtZSwgaXJxKTsKCQkJaXJxID0gMDsKCQl9IGVsc2UKCQkJZW5hYmxlX2lycShpcnEpOwoJfQoJcmV0dXJuIDA7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBFbmNhcHN1bGF0ZSB0aGUgYWJvdmUgZnVuY3Rpb25zIGluIHRoZSBjb3JyZWN0IG9wZXJhdGlvbnMgc3RydWN0dXJlLgogKiBUaGlzIGlzIG9ubHkgZG9uZSB3aGVuIG1vcmUgdGhhbiBvbmUgaGFyZHdhcmUgYWRhcHRlciBpcyBzdXBwb3J0ZWQuCiAqLwpzdGF0aWMgc3RydWN0IGkyY19hbGdvX3BjZl9kYXRhIHBjZl9pc2FfZGF0YSA9IHsKCS5zZXRwY2YJICAgID0gcGNmX2lzYV9zZXRieXRlLAoJLmdldHBjZgkgICAgPSBwY2ZfaXNhX2dldGJ5dGUsCgkuZ2V0b3duCSAgICA9IHBjZl9pc2FfZ2V0b3duLAoJLmdldGNsb2NrICAgPSBwY2ZfaXNhX2dldGNsb2NrLAoJLndhaXRmb3JwaW4gPSBwY2ZfaXNhX3dhaXRmb3JwaW4sCgkudWRlbGF5CSAgICA9IDEwLAoJLnRpbWVvdXQgICAgPSAxMDAsCn07CgpzdGF0aWMgc3RydWN0IGkyY19hZGFwdGVyIHBjZl9pc2Ffb3BzID0gewoJLm93bmVyCQk9IFRISVNfTU9EVUxFLAoJLmNsYXNzCQk9IEkyQ19DTEFTU19IV01PTiwKCS5pZAkJPSBJMkNfSFdfUF9FTEVLLAoJLmFsZ29fZGF0YQk9ICZwY2ZfaXNhX2RhdGEsCgkubmFtZQkJPSAiaTJjLWVsZWt0b3IiLAp9OwoKc3RhdGljIGludCBfX2RldmluaXQgZWxla3Rvcl9tYXRjaChzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBpZCkKewojaWZkZWYgX19hbHBoYV9fCgkvKiBjaGVjayB0byBzZWUgd2UgaGF2ZSBtZW1vcnkgbWFwcGVkIFBDRjg1ODQgY29ubmVjdGVkIHRvIHRoZQoJQ3lwcmVzcyBjeTgyYzY5MyBQQ0ktSVNBIGJyaWRnZSBhcyBvbiBVUDIwMDAgYm9hcmQgKi8KCWlmIChiYXNlID09IDApIHsKCQlzdHJ1Y3QgcGNpX2RldiAqY3k2OTNfZGV2OwoKCQljeTY5M19kZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0NPTlRBUSwKCQkJCQkgICBQQ0lfREVWSUNFX0lEX0NPTlRBUV84MkM2OTMsIE5VTEwpOwoJCWlmIChjeTY5M19kZXYpIHsKCQkJdW5zaWduZWQgY2hhciBjb25maWc7CgkJCS8qIHllYXAsIHdlJ3ZlIGZvdW5kIGN5cHJlc3MsIGxldCdzIGNoZWNrIGNvbmZpZyAqLwoJCQlpZiAoIXBjaV9yZWFkX2NvbmZpZ19ieXRlKGN5NjkzX2RldiwgMHg0NywgJmNvbmZpZykpIHsKCgkJCQlkZXZfZGJnKGRldiwgImZvdW5kIGN5ODJjNjkzLCBjb25maWcgIgoJCQkJCSJyZWdpc3RlciAweDQ3ID0gMHglMDJ4XG4iLCBjb25maWcpOwoKCQkJCS8qIFVQMjAwMCBib2FyZCBoYXMgdGhpcyByZWdpc3RlciBzZXQgdG8gMHhlMSwKCQkJCSAgIGJ1dCB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgYXMgc2VlbXMgY2FuIGJlCgkJCQkgICByZXNldCBkdXJpbmcgdGhlIHByb3BlciBpbml0aWFsaXNhdGlvbgoJCQkJICAgc2VxdWVuY2UgaWYgZ3V5cyBmcm9tIEFQSSBkZWNpZGVzIHRvIGRvIHRoYXQKCQkJCSAgIChzbywgd2UgY2FuIGV2ZW4gZW5hYmxlIFRzdW5hbWkgUGNoaXAKCQkJCSAgIHdpbmRvdyBmb3IgdGhlIHVwcGVyIDEgR2IpICovCgoJCQkJLyogc28ganVzdCBjaGVjayBmb3IgUk9NQ1MgYXQgMHhlMDAwMCwKCQkJCSAgIFJPTUNTIGVuYWJsZWQgZm9yIHdyaXRlcwoJCQkJICAgYW5kIGV4dGVybmFsIFhEIEJ1cyBidWZmZXIgaW4gdXNlLiAqLwoJCQkJaWYgKChjb25maWcgJiAweDdmKSA9PSAweDYxKSB7CgkJCQkJLyogc2VlbXMgdG8gYmUgVVAyMDAwIGxpa2UgYm9hcmQgKi8KCQkJCQliYXNlID0gMHhlMDAwMDsKCQkJCQltbWFwcGVkID0gMTsKCQkJCQkvKiBVUDIwMDAgZHJpdmVzIElTQSB3aXRoCgkJCQkJICAgOC4yNSBNSHogKFBDSS80KSBjbG9jawoJCQkJCSAgICh0aGlzIGNhbiBiZSByZWFkIGZyb20gY3lwcmVzcykgKi8KCQkJCQljbG9jayA9IEkyQ19QQ0ZfQ0xLIHwgSTJDX1BDRl9UUk5TOTA7CgkJCQkJZGV2X2luZm8oZGV2LCAiZm91bmQgQVBJIFVQMjAwMCBsaWtlICIKCQkJCQkJICJib2FyZCwgd2lsbCBwcm9iZSBQQ0Y4NTg0ICIKCQkJCQkJICJsYXRlclxuIik7CgkJCQl9CgkJCX0KCQkJcGNpX2Rldl9wdXQoY3k2OTNfZGV2KTsKCQl9Cgl9CiNlbmRpZgoKCS8qIHNhbml0eSBjaGVja3MgZm9yIG1tYXBwZWQgSS9PICovCglpZiAobW1hcHBlZCAmJiBiYXNlIDwgMHhjODAwMCkgewoJCWRldl9lcnIoZGV2LCAiaW5jb3JyZWN0IGJhc2UgYWRkcmVzcyAoJSN4KSBzcGVjaWZpZWQgIgoJCSAgICAgICAiZm9yIG1tYXBwZWQgSS9PXG4iLCBiYXNlKTsKCQlyZXR1cm4gMDsKCX0KCglpZiAoYmFzZSA9PSAwKSB7CgkJYmFzZSA9IERFRkFVTFRfQkFTRTsKCX0KCXJldHVybiAxOwp9CgpzdGF0aWMgaW50IF9fZGV2aW5pdCBlbGVrdG9yX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGlkKQp7Cglpbml0X3dhaXRxdWV1ZV9oZWFkKCZwY2Zfd2FpdCk7CglpZiAocGNmX2lzYV9pbml0KCkpCgkJcmV0dXJuIC1FTk9ERVY7CglwY2ZfaXNhX29wcy5kZXYucGFyZW50ID0gZGV2OwoJaWYgKGkyY19wY2ZfYWRkX2J1cygmcGNmX2lzYV9vcHMpIDwgMCkKCQlnb3RvIGZhaWw7CgoJZGV2X2luZm8oZGV2LCAiZm91bmQgZGV2aWNlIGF0ICUjeFxuIiwgYmFzZSk7CgoJcmV0dXJuIDA7CgogZmFpbDoKCWlmIChpcnEgPiAwKSB7CgkJZGlzYWJsZV9pcnEoaXJxKTsKCQlmcmVlX2lycShpcnEsIE5VTEwpOwoJfQoKCWlmICghbW1hcHBlZCkgewoJCWlvcG9ydF91bm1hcChiYXNlX2lvbWVtKTsKCQlyZWxlYXNlX3JlZ2lvbihiYXNlLCAyKTsKCX0gZWxzZSB7CgkJaW91bm1hcChiYXNlX2lvbWVtKTsKCQlyZWxlYXNlX21lbV9yZWdpb24oYmFzZSwgMik7Cgl9CglyZXR1cm4gLUVOT0RFVjsKfQoKc3RhdGljIGludCBfX2RldmV4aXQgZWxla3Rvcl9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgaWQpCnsKCWkyY19kZWxfYWRhcHRlcigmcGNmX2lzYV9vcHMpOwoKCWlmIChpcnEgPiAwKSB7CgkJZGlzYWJsZV9pcnEoaXJxKTsKCQlmcmVlX2lycShpcnEsIE5VTEwpOwoJfQoKCWlmICghbW1hcHBlZCkgewoJCWlvcG9ydF91bm1hcChiYXNlX2lvbWVtKTsKCQlyZWxlYXNlX3JlZ2lvbihiYXNlLCAyKTsKCX0gZWxzZSB7CgkJaW91bm1hcChiYXNlX2lvbWVtKTsKCQlyZWxlYXNlX21lbV9yZWdpb24oYmFzZSwgMik7Cgl9CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBzdHJ1Y3QgaXNhX2RyaXZlciBpMmNfZWxla3Rvcl9kcml2ZXIgPSB7CgkubWF0Y2gJCT0gZWxla3Rvcl9tYXRjaCwKCS5wcm9iZQkJPSBlbGVrdG9yX3Byb2JlLAoJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChlbGVrdG9yX3JlbW92ZSksCgkuZHJpdmVyID0gewoJCS5vd25lcgk9IFRISVNfTU9EVUxFLAoJCS5uYW1lCT0gImkyYy1lbGVrdG9yIiwKCX0sCn07CgpzdGF0aWMgaW50IF9faW5pdCBpMmNfcGNmaXNhX2luaXQodm9pZCkKewoJcmV0dXJuIGlzYV9yZWdpc3Rlcl9kcml2ZXIoJmkyY19lbGVrdG9yX2RyaXZlciwgMSk7Cn0KCnN0YXRpYyB2b2lkIF9fZXhpdCBpMmNfcGNmaXNhX2V4aXQodm9pZCkKewoJaXNhX3VucmVnaXN0ZXJfZHJpdmVyKCZpMmNfZWxla3Rvcl9kcml2ZXIpOwp9CgpNT0RVTEVfQVVUSE9SKCJIYW5zIEJlcmdsdW5kIDxoYkBzcGFjZXRlYy5ubz4iKTsKTU9EVUxFX0RFU0NSSVBUSU9OKCJJMkMtQnVzIGFkYXB0ZXIgcm91dGluZXMgZm9yIFBDRjg1ODQgSVNBIGJ1cyBhZGFwdGVyIik7Ck1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKCm1vZHVsZV9wYXJhbShiYXNlLCBpbnQsIDApOwptb2R1bGVfcGFyYW0oaXJxLCBpbnQsIDApOwptb2R1bGVfcGFyYW0oY2xvY2ssIGludCwgMCk7Cm1vZHVsZV9wYXJhbShvd24sIGludCwgMCk7Cm1vZHVsZV9wYXJhbShtbWFwcGVkLCBpbnQsIDApOwoKbW9kdWxlX2luaXQoaTJjX3BjZmlzYV9pbml0KTsKbW9kdWxlX2V4aXQoaTJjX3BjZmlzYV9leGl0KTsK