LyoKICogKEMpIENvcHlyaWdodCAyMDA1LTIwMDYKICogU3RlZmFuIFJvZXNlLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCBzckBkZW54LmRlLgogKgogKiAoQykgQ29weXJpZ2h0IDIwMDYKICogREFWRSBTcmwgPHd3dy5kYXZlLXRlY2guaXQ+CiAqCiAqIChDKSBDb3B5cmlnaHQgMjAwMi0yMDA0CiAqIFN0ZWZhbiBSb2VzZSwgZXNkIGdtYmggZ2VybWFueSwgc3RlZmFuLnJvZXNlQGVzZC1lbGVjdHJvbmljcy5jb20KICoKICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICogcHJvamVjdC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICogTUEgMDIxMTEtMTMwNyBVU0EKICovCgojaW5jbHVkZSA8Y29tbW9uLmg+CiNpbmNsdWRlIDxwcGM0eHguaD4KI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KI2luY2x1ZGUgInNkcmFtLmgiCgoKI2lmZGVmIENPTkZJR19TRFJBTV9CQU5LMAoKCiNpZm5kZWYgQ0ZHX1NEUkFNX1RBQkxFCnNkcmFtX2NvbmZfdCBtYjBjZltdID0gewoJeygxMjggPDwgMjApLCAxMywgMHgwMDBBNDAwMX0sCSAgICAvKiAoMC0xMjhNQikgQWRkcmVzcyBNb2RlIDMsIDEzeDEwKDQpICovCgl7KDY0IDw8IDIwKSwgIDEzLCAweDAwMDg0MDAxfSwJICAgIC8qICgwLTY0TUIpIEFkZHJlc3MgTW9kZSAzLCAxM3g5KDQpCSAgKi8KCXsoMzIgPDwgMjApLCAgMTIsIDB4MDAwNjIwMDF9LAkgICAgLyogKDAtMzJNQikgQWRkcmVzcyBNb2RlIDIsIDEyeDkoNCkJICAqLwoJeygxNiA8PCAyMCksICAxMiwgMHgwMDA0NjAwMX0sCSAgICAvKiAoMC0xNk1CKSBBZGRyZXNzIE1vZGUgNCwgMTJ4OCg0KQkgICovCgl7KDQgPDwgMjApLCAgIDExLCAweDAwMDA4MDAxfSwJICAgIC8qICgwLTRNQikgQWRkcmVzcyBNb2RlIDUsIDExeDgoMikJICAqLwp9OwojZWxzZQpzZHJhbV9jb25mX3QgbWIwY2ZbXSA9IENGR19TRFJBTV9UQUJMRTsKI2VuZGlmCgojZGVmaW5lIE5fTUIwQ0YgKHNpemVvZihtYjBjZikgLyBzaXplb2YobWIwY2ZbMF0pKQoKCiNpZm5kZWYgQ09ORklHXzQ0MAoKI2lmZGVmIENGR19TRFJBTV9DQVNMCnN0YXRpYyB1bG9uZyBuczJjbGtzKHVsb25nIG5zKQp7Cgl1bG9uZyBidXNfcGVyaW9kX3hfMTAgPSBPTkVfQklMTElPTiAvIChnZXRfYnVzX2ZyZXEoMCkgLyAxMCk7CgoJcmV0dXJuICgobnMgKiAxMCkgKyBidXNfcGVyaW9kX3hfMTApIC8gYnVzX3BlcmlvZF94XzEwOwp9CiNlbmRpZiAvKiBDRkdfU0RSQU1fQ0FTTCAqLwoKc3RhdGljIHVsb25nIGNvbXB1dGVfc2R0cjEodWxvbmcgc3BlZWQpCnsKI2lmZGVmIENGR19TRFJBTV9DQVNMCgl1bG9uZyB0bXA7Cgl1bG9uZyBzZHRyMSA9IDA7CgoJLyogQ0FTTCAqLwoJaWYgKENGR19TRFJBTV9DQVNMIDwgMikKCQlzZHRyMSB8PSAoMSA8PCBTRFJBTTBfVFJfQ0FTTCk7CgllbHNlCgkJaWYgKENGR19TRFJBTV9DQVNMID4gNCkKCQkJc2R0cjEgfD0gKDMgPDwgU0RSQU0wX1RSX0NBU0wpOwoJCWVsc2UKCQkJc2R0cjEgfD0gKChDRkdfU0RSQU1fQ0FTTC0xKSA8PCBTRFJBTTBfVFJfQ0FTTCk7CgoJLyogUFRBICovCgl0bXAgPSBuczJjbGtzKENGR19TRFJBTV9QVEEpOwoJaWYgKCh0bXAgPj0gMikgJiYgKHRtcCA8PSA0KSkKCQlzZHRyMSB8PSAoKHRtcC0xKSA8PCBTRFJBTTBfVFJfUFRBKTsKCWVsc2UKCQlzZHRyMSB8PSAoKDQtMSkgPDwgU0RSQU0wX1RSX1BUQSk7CgoJLyogQ1RQICovCgl0bXAgPSBuczJjbGtzKENGR19TRFJBTV9DVFApOwoJaWYgKCh0bXAgPj0gMikgJiYgKHRtcCA8PSA0KSkKCQlzZHRyMSB8PSAoKHRtcC0xKSA8PCBTRFJBTTBfVFJfQ1RQKTsKCWVsc2UKCQlzZHRyMSB8PSAoKDQtMSkgPDwgU0RSQU0wX1RSX0NUUCk7CgoJLyogTERGICovCgl0bXAgPSBuczJjbGtzKENGR19TRFJBTV9MREYpOwoJaWYgKCh0bXAgPj0gMikgJiYgKHRtcCA8PSA0KSkKCQlzZHRyMSB8PSAoKHRtcC0xKSA8PCBTRFJBTTBfVFJfTERGKTsKCWVsc2UKCQlzZHRyMSB8PSAoKDItMSkgPDwgU0RSQU0wX1RSX0xERik7CgoJLyogUkZUQSAqLwoJdG1wID0gbnMyY2xrcyhDRkdfU0RSQU1fUkZUQSk7CglpZiAoKHRtcCA+PSA0KSAmJiAodG1wIDw9IDEwKSkKCQlzZHRyMSB8PSAoKHRtcC00KSA8PCBTRFJBTTBfVFJfUkZUQSk7CgllbHNlCgkJc2R0cjEgfD0gKCgxMC00KSA8PCBTRFJBTTBfVFJfUkZUQSk7CgoJLyogUkNEICovCgl0bXAgPSBuczJjbGtzKENGR19TRFJBTV9SQ0QpOwoJaWYgKCh0bXAgPj0gMikgJiYgKHRtcCA8PSA0KSkKCQlzZHRyMSB8PSAoKHRtcC0xKSA8PCBTRFJBTTBfVFJfUkNEKTsKCWVsc2UKCQlzZHRyMSB8PSAoKDQtMSkgPDwgU0RSQU0wX1RSX1JDRCk7CgoJcmV0dXJuIHNkdHIxOwojZWxzZSAvKiBDRkdfU0RSQU1fQ0FTTCAqLwoJLyoKCSAqIElmIG5vIHZhbHVlcyBhcmUgY29uZmlndXJlZCBpbiB0aGUgYm9hcmQgY29uZmlnIGZpbGUKCSAqIHVzZSB0aGUgZGVmYXVsdCB2YWx1ZXMsIHdoaWNoIHNlZW0gdG8gYmUgb2sgZm9yIG1vc3QKCSAqIGJvYXJkcy4KCSAqCgkgKiBSRU1BUks6CgkgKiBGb3IgbmV3IGJvYXJkIHBvcnRzIHdlIHN0cm9uZ2x5IHJlY29tbWVuZCB0byBkZWZpbmUgdGhlCgkgKiBjb3JyZWN0IHZhbHVlcyBmb3IgdGhlIHVzZWQgU0RSQU0gY2hpcHMgaW4geW91ciBib2FyZAoJICogY29uZmlnIGZpbGUgKHNlZSBQUENoYW1lbGVvbkVWQi5oKQoJICovCglpZiAoc3BlZWQgPiAxMDAwMDAwMDApIHsKCQkvKgoJCSAqIDEzMyBNSHogU0RSQU0KCQkgKi8KCQlyZXR1cm4gMHgwMTA3NDAxNTsKCX0gZWxzZSB7CgkJLyoKCQkgKiBkZWZhdWx0OiAxMDAgTUh6IFNEUkFNCgkJICovCgkJcmV0dXJuIDB4MDA4NjQwMGQ7Cgl9CiNlbmRpZiAvKiBDRkdfU0RSQU1fQ0FTTCAqLwp9CgovKiByZWZyZXNoIGlzIGV4cHJlc3NlZCBpbiBtcyAqLwpzdGF0aWMgdWxvbmcgY29tcHV0ZV9ydHIodWxvbmcgc3BlZWQsIHVsb25nIHJvd3MsIHVsb25nIHJlZnJlc2gpCnsKI2lmZGVmIENGR19TRFJBTV9DQVNMCgl1bG9uZyB0bXA7CgoJdG1wID0gKChyZWZyZXNoKjEwMDAqMTAwMCkgLyAoMSA8PCByb3dzKSkgKiAoc3BlZWQgLyAxMDAwKTsKCXRtcCAvPSAxMDAwMDAwOwoKCXJldHVybiAoKHRtcCAmIDB4MDAwMDNGRjgpIDw8IDE2KTsKI2Vsc2UgLyogQ0ZHX1NEUkFNX0NBU0wgKi8KCWlmIChzcGVlZCA+IDEwMDAwMDAwMCkgewoJCS8qCgkJICogMTMzIE1IeiBTRFJBTQoJCSAqLwoJCXJldHVybiAweDA3ZjAwMDAwOwoJfSBlbHNlIHsKCQkvKgoJCSAqIGRlZmF1bHQ6IDEwMCBNSHogU0RSQU0KCQkgKi8KCQlyZXR1cm4gMHgwNWYwMDAwMDsKCX0KI2VuZGlmIC8qIENGR19TRFJBTV9DQVNMICovCn0KCi8qCiAqIEF1dG9kZXRlY3Qgb25ib2FyZCBTRFJBTSBvbiA0MDUgcGxhdGZvcm1zCiAqLwp2b2lkIHNkcmFtX2luaXQodm9pZCkKewoJdWxvbmcgc3BlZWQ7Cgl1bG9uZyBzZHRyMTsKCWludCBpOwoKCS8qCgkgKiBEZXRlcm1pbmUgU0RSQU0gc3BlZWQKCSAqLwoJc3BlZWQgPSBnZXRfYnVzX2ZyZXEoMCk7IC8qIHBhcmFtZXRlciBub3QgdXNlZCBvbiBwcGM0eHggKi8KCgkvKgoJICogc2R0cjEgKHJlZ2lzdGVyIFNEUkFNMF9UUikgbXVzdCB0YWtlIGludG8gYWNjb3VudCB0aW1pbmdzIGxpc3RlZAoJICogaW4gU0RSQU0gY2hpcCBkYXRhc2hlZXQuIHJ0ciAocmVnaXN0ZXIgU0RSQU0wX1JUUikgbXVzdCB0YWtlIGludG8KCSAqIGFjY291bnQgYWN0dWFsIFNEUkFNIHNpemUuIFNvIHdlIGNhbiBzZXQgdXAgc2R0cjEgYWNjb3JkaW5nIHRvIHdoYXQKCSAqIGlzIHNwZWNpZmllZCBpbiBib2FyZCBjb25maWd1cmF0aW9uIGZpbGUgd2hpbGUgcnRyIGRlcGVuZGRzIG9uIFNEUkFNCgkgKiBzaXplIHdlIGFyZSBhc3N1bWluZyBiZWZvcmUgZGV0ZWN0aW9uLgoJICovCglzZHRyMSA9IGNvbXB1dGVfc2R0cjEoc3BlZWQpOwoKCWZvciAoaT0wOyBpPE5fTUIwQ0Y7IGkrKykgewoJCS8qCgkJICogRGlzYWJsZSBtZW1vcnkgY29udHJvbGxlci4KCQkgKi8KCQltdHNkcmFtMChtZW1fbWNvcHQxLCAweDAwMDAwMDAwKTsKCgkJLyoKCQkgKiBTZXQgTUIwQ0YgZm9yIGJhbmsgMC4KCQkgKi8KCQltdHNkcmFtMChtZW1fbWIwY2YsIG1iMGNmW2ldLnJlZyk7CgkJbXRzZHJhbTAobWVtX3NkdHIxLCBzZHRyMSk7CgkJbXRzZHJhbTAobWVtX3J0ciwgY29tcHV0ZV9ydHIoc3BlZWQsIG1iMGNmW2ldLnJvd3MsIDY0KSk7CgoJCXVkZWxheSgyMDApOwoKCQkvKgoJCSAqIFNldCBtZW1vcnkgY29udHJvbGxlciBvcHRpb25zIHJlZywgTUNPUFQxLgoJCSAqIFNldCBEQ19FTiB0byAnMScgYW5kIEJSRF9QUkYgdG8gJzAxJyBmb3IgMTYgYnl0ZSBQTEIgQnVyc3QKCQkgKiByZWFkL3ByZWZldGNoLgoJCSAqLwoJCW10c2RyYW0wKG1lbV9tY29wdDEsIDB4ODA4MDAwMDApOwoKCQl1ZGVsYXkoMTAwMDApOwoKCQlpZiAoZ2V0X3JhbV9zaXplKDAsIG1iMGNmW2ldLnNpemUpID09IG1iMGNmW2ldLnNpemUpIHsKCQkJLyoKCQkJICogT0ssIHNpemUgZGV0ZWN0ZWQgLT4gYWxsIGRvbmUKCQkJICovCgkJCXJldHVybjsKCQl9Cgl9Cn0KCiNlbHNlIC8qIENPTkZJR180NDAgKi8KCiNkZWZpbmUgTlVNX1RSSUVTIDY0CiNkZWZpbmUgTlVNX1JFQURTIDEwCgpzdGF0aWMgdm9pZCBzZHJhbV90cjFfc2V0KGludCByYW1fYWRkcmVzcywgaW50KiB0cjFfdmFsdWUpCnsKCWludCBpOwoJaW50IGosIGs7Cgl2b2xhdGlsZSB1bnNpZ25lZCBpbnQqIHJhbV9wb2ludGVyID0gKHVuc2lnbmVkIGludCAqKXJhbV9hZGRyZXNzOwoJaW50IGZpcnN0X2dvb2QgPSAtMSwgbGFzdF9iYWQgPSAweDFmZjsKCgl1bnNpZ25lZCBsb25nIHRlc3RbTlVNX1RSSUVTXSA9IHsKCQkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweEZGRkZGRkZGLCAweEZGRkZGRkZGLAoJCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4RkZGRkZGRkYsIDB4RkZGRkZGRkYsCgkJMHhGRkZGRkZGRiwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKCQkweEZGRkZGRkZGLCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAoJCTB4QUFBQUFBQUEsIDB4QUFBQUFBQUEsIDB4NTU1NTU1NTUsIDB4NTU1NTU1NTUsCgkJMHhBQUFBQUFBQSwgMHhBQUFBQUFBQSwgMHg1NTU1NTU1NSwgMHg1NTU1NTU1NSwKCQkweDU1NTU1NTU1LCAweDU1NTU1NTU1LCAweEFBQUFBQUFBLCAweEFBQUFBQUFBLAoJCTB4NTU1NTU1NTUsIDB4NTU1NTU1NTUsIDB4QUFBQUFBQUEsIDB4QUFBQUFBQUEsCgkJMHhBNUE1QTVBNSwgMHhBNUE1QTVBNSwgMHg1QTVBNUE1QSwgMHg1QTVBNUE1QSwKCQkweEE1QTVBNUE1LCAweEE1QTVBNUE1LCAweDVBNUE1QTVBLCAweDVBNUE1QTVBLAoJCTB4NUE1QTVBNUEsIDB4NUE1QTVBNUEsIDB4QTVBNUE1QTUsIDB4QTVBNUE1QTUsCgkJMHg1QTVBNUE1QSwgMHg1QTVBNUE1QSwgMHhBNUE1QTVBNSwgMHhBNUE1QTVBNSwKCQkweEFBNTVBQTU1LCAweEFBNTVBQTU1LCAweDU1QUE1NUFBLCAweDU1QUE1NUFBLAoJCTB4QUE1NUFBNTUsIDB4QUE1NUFBNTUsIDB4NTVBQTU1QUEsIDB4NTVBQTU1QUEsCgkJMHg1NUFBNTVBQSwgMHg1NUFBNTVBQSwgMHhBQTU1QUE1NSwgMHhBQTU1QUE1NSwKCQkweDU1QUE1NUFBLCAweDU1QUE1NUFBLCAweEFBNTVBQTU1LCAweEFBNTVBQTU1IH07CgoJLyogZ28gdGhyb3VnaCBhbGwgcG9zc2libGUgU0RSQU0wX1RSMVtSRENUXSB2YWx1ZXMgKi8KCWZvciAoaT0wOyBpPD0weDFmZjsgaSsrKSB7CgkJLyogc2V0IHRoZSBjdXJyZW50IHZhbHVlIGZvciBUUjEgKi8KCQltdHNkcmFtKG1lbV90cjEsICgweDgwODAwODAwIHwgaSkpOwoKCQkvKiB3cml0ZSB2YWx1ZXMgKi8KCQlmb3IgKGo9MDsgajxOVU1fVFJJRVM7IGorKykgewoJCQlyYW1fcG9pbnRlcltqXSA9IHRlc3Rbal07CgoJCQkvKiBjbGVhciBhbnkgY2FjaGUgYXQgcmFtIGxvY2F0aW9uICovCgkJCV9fYXNtX18oImRjYmYgMCwlMCI6IDoiciIgKCZyYW1fcG9pbnRlcltqXSkpOwoJCX0KCgkJLyogcmVhZCB2YWx1ZXMgYmFjayAqLwoJCWZvciAoaj0wOyBqPE5VTV9UUklFUzsgaisrKSB7CgkJCWZvciAoaz0wOyBrPE5VTV9SRUFEUzsgaysrKSB7CgkJCQkvKiBjbGVhciBhbnkgY2FjaGUgYXQgcmFtIGxvY2F0aW9uICovCgkJCQlfX2FzbV9fKCJkY2JmIDAsJTAiOiA6InIiICgmcmFtX3BvaW50ZXJbal0pKTsKCgkJCQlpZiAocmFtX3BvaW50ZXJbal0gIT0gdGVzdFtqXSkKCQkJCQlicmVhazsKCQkJfQoKCQkJLyogcmVhZCBlcnJvciAqLwoJCQlpZiAoayAhPSBOVU1fUkVBRFMpCgkJCQlicmVhazsKCQl9CgoJCS8qIHdlIGhhdmUgYSBTRFJBTTBfVFIxW1JEQ1RdIHRoYXQgaXMgcGFydCBvZiB0aGUgd2luZG93ICovCgkJaWYgKGogPT0gTlVNX1RSSUVTKSB7CgkJCWlmIChmaXJzdF9nb29kID09IC0xKQoJCQkJZmlyc3RfZ29vZCA9IGk7CQkvKiBmb3VuZCBiZWdpbm5pbmcgb2Ygd2luZG93ICovCgkJfSBlbHNlIHsgLyogYmFkIHJlYWQgKi8KCQkJLyogaWYgd2UgaGF2ZSBub3QgaGFkIGEgZ29vZCByZWFkIHRoZW4gZG9uJ3QgY2FyZSAqLwoJCQlpZiAoZmlyc3RfZ29vZCAhPSAtMSkgewoJCQkJLyogZmlyc3QgZmFpbHVyZSBhZnRlciBhIGdvb2QgcmVhZCAqLwoJCQkJbGFzdF9iYWQgPSBpLTE7CgkJCQlicmVhazsKCQkJfQoJCX0KCX0KCgkvKiByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgZm9yIFRSMSAqLwoJKnRyMV92YWx1ZSA9IChmaXJzdF9nb29kICsgbGFzdF9iYWQpIC8gMjsKfQoKCiNpZmRlZiBDT05GSUdfU0RSQU1fRUNDCnN0YXRpYyB2b2lkIGVjY19pbml0KHVsb25nIHN0YXJ0LCB1bG9uZyBzaXplKQp7Cgl1bG9uZwljdXJyZW50X2FkZHI7CQkvKiBjdXJyZW50IGJ5dGUgYWRkcmVzcyAqLwoJdWxvbmcJZW5kX2FkZHI7CQkvKiBlbmQgb2YgbWVtb3J5IHJlZ2lvbiAqLwoJdWxvbmcJYWRkcl9pbmM7CQkvKiBhZGRyZXNzIHNraXAgYmV0d2VlbiB3cml0ZXMgKi8KCXVsb25nCWNmZzBfcmVnOwkJLyogZm9yIHJlc3RvcmluZyBFQ0Mgc3RhdGUgKi8KCgkvKgoJICogVE9ETzogRW5hYmxlIGRjYWNoZSBiZWZvcmUgcnVubmluZyB0aGlzIHRlc3QgKHNwZWVkdXApCgkgKi8KCgltZnNkcmFtKG1lbV9jZmcwLCBjZmcwX3JlZyk7CgltdHNkcmFtKG1lbV9jZmcwLCAoY2ZnMF9yZWcgJiB+U0RSQU1fQ0ZHMF9NRU1DSEspIHwgU0RSQU1fQ0ZHMF9NRU1DSEtfR0VOKTsKCgkvKgoJICogbG9vayBhdCBnZW9tZXRyeSBvZiBTRFJBTSAoZGF0YSB3aWR0aCkgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgd2UKCSAqIGNhbiBza2lwIHdvcmRzIHdoZW4gd3JpdGluZwoJICovCglpZiAoKGNmZzBfcmVnICYgU0RSQU1fQ0ZHMF9EUkFNV0RUSCkgPT0gU0RSQU1fQ0ZHMF9EUkFNV0RUSF8zMikKCQlhZGRyX2luYyA9IDQ7CgllbHNlCgkJYWRkcl9pbmMgPSA4OwoKCWN1cnJlbnRfYWRkciA9IHN0YXJ0OwoJZW5kX2FkZHIgPSBzdGFydCArIHNpemU7CgoJd2hpbGUgKGN1cnJlbnRfYWRkciA8IGVuZF9hZGRyKSB7CgkJKigodWxvbmcgKiljdXJyZW50X2FkZHIpID0gMHgwMDAwMDAwMDsKCQljdXJyZW50X2FkZHIgKz0gYWRkcl9pbmM7Cgl9CgoJLyoKCSAqIFRPRE86IEZsdXNoIGRjYWNoZSBhbmQgZGlzYWJsZSBpdCBhZ2FpbgoJICovCgoJLyoKCSAqIEVuYWJsZSBlY2MgY2hlY2tpbmcgYW5kIHBhcml0eSBlcnJvcnMKCSAqLwoJbXRzZHJhbShtZW1fY2ZnMCwgKGNmZzBfcmVnICYgflNEUkFNX0NGRzBfTUVNQ0hLKSB8IFNEUkFNX0NGRzBfTUVNQ0hLX0NISyk7Cn0KI2VuZGlmCgovKgogKiBBdXRvZGV0ZWN0IG9uYm9hcmQgRERSIFNEUkFNIG9uIDQ0MCBwbGF0Zm9ybXMKICoKICogTk9URTogU29tZSBvZiB0aGUgaGFyZGNvZGVkIHZhbHVlcyBhcmUgaGFyZHdhcmUgZGVwZW5kYW50LAogKgkgc28gdGhpcyBzaG91bGQgYmUgZXh0ZW5kZWQgZm9yIG90aGVyIGZ1dHVyZSBib2FyZHMKICoJIHVzaW5nIHRoaXMgcm91dGluZSEKICovCmxvbmcgaW50IGluaXRkcmFtKGludCBib2FyZF90eXBlKQp7CglpbnQgaTsKCWludCB0cjFfYmFuazE7CgojaWYgZGVmaW5lZChDT05GSUdfNDQwR1gpIHx8IGRlZmluZWQoQ09ORklHXzQ0MEVQKSB8fCBkZWZpbmVkKENPTkZJR180NDBHUikgfHwgZGVmaW5lZChDT05GSUdfNDQwU1ApCgkvKgoJICogU29mdC1yZXNldCBTRFJBTSBjb250cm9sbGVyLgoJICovCgltdHNkcihzZHJfc3JzdCwgU0RSMF9TUlNUX0RNQyk7CgltdHNkcihzZHJfc3JzdCwgMHgwMDAwMDAwMCk7CiNlbmRpZgoKCWZvciAoaT0wOyBpPE5fTUIwQ0Y7IGkrKykgewoJCS8qCgkJICogRGlzYWJsZSBtZW1vcnkgY29udHJvbGxlci4KCQkgKi8KCQltdHNkcmFtKG1lbV9jZmcwLCAweDAwMDAwMDAwKTsKCgkJLyoKCQkgKiBTZXR1cCBzb21lIGRlZmF1bHQKCQkgKi8KCQltdHNkcmFtKG1lbV91YWJiYSwgMHgwMDAwMDAwMCk7IC8qIHViYmE9MCAoZGVmYXVsdCkJCSovCgkJbXRzZHJhbShtZW1fc2xpbywgMHgwMDAwMDAwMCk7CS8qIHJkcmU9MCB3cnJlPTAgcmFydz0wCQkqLwoJCW10c2RyYW0obWVtX2Rldm9wdCwgMHgwMDAwMDAwMCk7IC8qIGRsbD0wIGRzPTAgKG5vcm1hbCkJCSovCgkJbXRzZHJhbShtZW1fd2RkY3RyLCAweDAwMDAwMDAwKTsgLyogd3JjcD0wIGRjZD0wCQkqLwoJCW10c2RyYW0obWVtX2Nsa3RyLCAweDQwMDAwMDAwKTsgLyogY2xrcD0xICg5MCBkZWcgd3IpIGRjZHQ9MAkqLwoKCQkvKgoJCSAqIEZvbGxvd2luZyBmb3IgQ0FTIExhdGVuY3kgPSAyLjUgQCAxMzMgTUh6IFBMQgoJCSAqLwoJCW10c2RyYW0obWVtX2IwY3IsIG1iMGNmW2ldLnJlZyk7CgkJbXRzZHJhbShtZW1fdHIwLCAweDQxMDk0MDEyKTsKCQltdHNkcmFtKG1lbV90cjEsIDB4ODA4MDA4MDApOwkvKiBTUz1UMiBTTD1TVEFHRSAzIENEPTEgQ1Q9MHgwMCovCgkJbXRzZHJhbShtZW1fcnRyLCAweDdlMDAwMDAwKTsJLyogSW50ZXJ2YWwgMTUuMjC1cyBAIDEzM01IeiBQTEIqLwoJCW10c2RyYW0obWVtX2NmZzEsIDB4MDAwMDAwMDApOwkvKiBTZWxmLXJlZnJlc2ggZXhpdCwgZGlzYWJsZSBQTSovCgkJdWRlbGF5KDQwMCk7CQkJLyogRGVsYXkgMjAwIHVzZWNzIChtaW4pCSovCgoJCS8qCgkJICogRW5hYmxlIHRoZSBjb250cm9sbGVyLCB0aGVuIHdhaXQgZm9yIERDRU4gdG8gY29tcGxldGUKCQkgKi8KCQltdHNkcmFtKG1lbV9jZmcwLCAweDgyMDAwMDAwKTsJLyogRENFTj0xLCBQTVVEPTAsIDY0LWJpdAkqLwoJCXVkZWxheSgxMDAwMCk7CgoJCWlmIChnZXRfcmFtX3NpemUoMCwgbWIwY2ZbaV0uc2l6ZSkgPT0gbWIwY2ZbaV0uc2l6ZSkgewoJCQkvKgoJCQkgKiBPcHRpbWl6ZSBUUjEgdG8gY3VycmVudCBoYXJkd2FyZSBlbnZpcm9ubWVudAoJCQkgKi8KCQkJc2RyYW1fdHIxX3NldCgweDAwMDAwMDAwLCAmdHIxX2JhbmsxKTsKCQkJbXRzZHJhbShtZW1fdHIxLCAodHIxX2JhbmsxIHwgMHg4MDgwMDgwMCkpOwoKI2lmZGVmIENPTkZJR19TRFJBTV9FQ0MKCQkJZWNjX2luaXQoMCwgbWIwY2ZbaV0uc2l6ZSk7CiNlbmRpZgoKCQkJLyoKCQkJICogT0ssIHNpemUgZGV0ZWN0ZWQgLT4gYWxsIGRvbmUKCQkJICovCgkJCXJldHVybiBtYjBjZltpXS5zaXplOwoJCX0KCX0KCglyZXR1cm4gMDsJCQkJLyogbm90aGluZyBmb3VuZCAhCQkqLwp9CgojZW5kaWYgLyogQ09ORklHXzQ0MCAqLwoKI2VuZGlmIC8qIENPTkZJR19TRFJBTV9CQU5LMCAqLwo=