LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCIDxkYW5pZWxAb21pY3Jvbi5zZT4uCiAqCiAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCiAqIHByb2plY3QuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCiAqIE1BIDAyMTExLTEzMDcgVVNBCiAqLwoKLyoKICogQmFzZWQgb24gc2M1MjBjZHAuYyBmcm9tIHJvbG8gMS42OgogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogKEMpIENvcHlyaWdodCAyMDAwCiAqIFN5c2dvIFJlYWwtVGltZSBTb2x1dGlvbnMgR21iSAogKiBLbGVpbi1XaW50ZXJuaGVpbSwgR2VybWFueQogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCgojaW5jbHVkZSA8Y29uZmlnLmg+CgojaWZkZWYgQ09ORklHX0FMSTE1MlgKCiNpbmNsdWRlIDxjb21tb24uaD4KI2luY2x1ZGUgPGFzbS9pby5oPgojaW5jbHVkZSA8YXNtL2ljL2FsaTUxMnguaD4KCgovKiBBTEkgTTUxMjMgTG9naWNhbCBkZXZpY2UgbnVtYmVyczoKICogMCBGREMKICogMSB1bnVzZWQ/CiAqIDIgdW51c2VkPwogKiAzIGxwdAogKiA0IFVBUlQxCiAqIDUgVUFSVDIKICogNiBSVEMKICogNyBtb3VzZS9rYmQKICogOCBDSU8KICovCgovKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICBTb21lIGFjY2VzcyBwcmltaXRpdmVzIGZvciB0aGUgQUxpIGNoaXA6ICAgICAgICAgICAgICAgICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKi8KCnN0YXRpYyB2b2lkIGFsaV93cml0ZSh1OCBpbmRleCwgdTggdmFsdWUpCnsKCS8qIHdyaXRlIGFuIGFyYmlyYXJ5IHJlZ2lzdGVyICovCglvdXRiKGluZGV4LCBBTElfSU5ERVgpOwoJb3V0Yih2YWx1ZSwgQUxJX0RBVEEpOwp9CgojaWYgMApzdGF0aWMgaW50IGFsaV9yZWFkKHU4IGluZGV4KQp7CglvdXRiKGluZGV4LCBBTElfSU5ERVgpOwoJcmV0dXJuIGluYihBTElfREFUQSk7Cn0KI2VuZGlmCgojZGVmaW5lIEFMSV9PUEVOKCkgXAoJb3V0YigweDUxLCBBTElfSU5ERVgpOyBcCglvdXRiKDB4MjMsIEFMSV9JTkRFWCkKCgojZGVmaW5lIEFMSV9DTE9TRSgpIFwKCW91dGIoMHhiYiwgQUxJX0lOREVYKQoKLyogU2VsZWN0IGEgbG9naWNhbCBkZXZpY2UgKi8KI2RlZmluZSBBTElfU0VMREVWKGRldikJXAoJYWxpX3dyaXRlKDB4MDcsIGRldikKCgp2b2lkIGFsaTUxMnhfaW5pdCh2b2lkKQp7CglBTElfT1BFTigpOwoKCWFsaV93cml0ZSgweDAyLCAweDAxKTsJLyogc29mdCByZXNldCAqLwoJYWxpX3dyaXRlKDB4MDMsIDB4MDMpOwkvKiBkaXNhYmxlIGFjY2VzcyB0byBDSU9zICovCglhbGlfd3JpdGUoMHgyMiwgMHgwMCk7CS8qIGRpc2FibGUgZGlyZWN0IHBvd2VyZG93biAqLwoJYWxpX3dyaXRlKDB4MjMsIDB4MDApOwkvKiBkaXNhYmxlIGF1dG8gcG93ZXJkb3duICovCglhbGlfd3JpdGUoMHgyNCwgMHgwMCk7CS8qIElSIDggaXMgYWN0aXZlIGhpLCBwaW4yNiBpcyBQRElSICovCgoJQUxJX0NMT1NFKCk7Cn0KCnZvaWQgYWxpNTEyeF9zZXRfZmRjKGludCBlbmFibGVkLCB1MTYgaW8sIHU4IGlycSwgdTggZG1hX2NoYW5uZWwpCnsKCUFMSV9PUEVOKCk7CglBTElfU0VMREVWKDApOwoKCWFsaV93cml0ZSgweDMwLCBlbmFibGVkPzE6MCk7CglpZiAoZW5hYmxlZCkgewoJCWFsaV93cml0ZSgweDYwLCBpbyA+PiA4KTsKCQlhbGlfd3JpdGUoMHg2MSwgaW8gJiAweGZmKTsKCQlhbGlfd3JpdGUoMHg3MCwgaXJxKTsKCQlhbGlfd3JpdGUoMHg3NCwgZG1hX2NoYW5uZWwpOwoKCQkvKiBBVCBtb2RlLCBubyBkcml2ZSBzd2FwICovCgkJYWxpX3dyaXRlKDB4ZjAsIDB4MDgpOwoJCWFsaV93cml0ZSgweGYxLCAweDAwKTsKCQlhbGlfd3JpdGUoMHhmMiwgMHhmZik7CgkJYWxpX3dyaXRlKDB4ZjQsIDB4MDApOwoJfQoJQUxJX0NMT1NFKCk7Cn0KCgp2b2lkIGFsaTUxMnhfc2V0X3BwKGludCBlbmFibGVkLCB1MTYgaW8sIHU4IGlycSwgdTggZG1hX2NoYW5uZWwpCnsKCUFMSV9PUEVOKCk7CglBTElfU0VMREVWKDMpOwoKCWFsaV93cml0ZSgweDMwLCBlbmFibGVkPzE6MCk7CglpZiAoZW5hYmxlZCkgewoJCWFsaV93cml0ZSgweDYwLCBpbyA+PiA4KTsKCQlhbGlfd3JpdGUoMHg2MSwgaW8gJiAweGZmKTsKCQlhbGlfd3JpdGUoMHg3MCwgaXJxKTsKCQlhbGlfd3JpdGUoMHg3NCwgZG1hX2NoYW5uZWwpOwoKCQkvKiBtb2RlOiBFUFAgMS45LCBFQ1AgRklGTyB0aHJlc2hvbGQgPSA3LCBJUlEgYWN0aXZlIGxvdyAqLwoJCWFsaV93cml0ZSgweGYwLCAweGJjKTsKCQkvKiAxMiBNSHosIEJ1cnN0IERNQSBpbiBFQ1AgKi8KCQlhbGlfd3JpdGUoMHhmMSwgMHgwNSk7Cgl9CglBTElfQ0xPU0UoKTsKCn0KCnZvaWQgYWxpNTEyeF9zZXRfdWFydChpbnQgZW5hYmxlZCwgaW50IGluZGV4LCB1MTYgaW8sIHU4IGlycSkKewoJQUxJX09QRU4oKTsKCUFMSV9TRUxERVYoaW5kZXg/NTo0KTsKCglhbGlfd3JpdGUoMHgzMCwgZW5hYmxlZD8xOjApOwoJaWYgKGVuYWJsZWQpIHsKCQlhbGlfd3JpdGUoMHg2MCwgaW8gPj4gOCk7CgkJYWxpX3dyaXRlKDB4NjEsIGlvICYgMHhmZik7CgkJYWxpX3dyaXRlKDB4NzAsIGlycSk7CgoJCWFsaV93cml0ZSgweGYwLCAweDAwKTsKCQlhbGlfd3JpdGUoMHhmMSwgMHgwMCk7CgoJCS8qIGh1aD8gd3JpdGUgMHhmMiB0d2ljZSAtIGEgdHlwbyBpbiByb2xvCgkJICogb3Igc29tZSBzZWNyZXQgYWxpIGVycmF0YT8gV2hvIGtub3dzPwoJCSAqLwoJCWlmIChpbmRleCkgewoJCQlhbGlfd3JpdGUoMHhmMiwgMHgwMCk7CgkJfQoJCWFsaV93cml0ZSgweGYyLCAweDBjKTsKCX0KCUFMSV9DTE9TRSgpOwoKfQoKdm9pZCBhbGk1MTJ4X3NldF91YXJ0Ml9pcmRhKGludCBlbmFibGVkKQp7CglBTElfT1BFTigpOwoJQUxJX1NFTERFVig1KTsKCglhbGlfd3JpdGUoMHhmMSwgZW5hYmxlZD8weDQ4OjB4MDApOyAvKiBmdWxsZHVwbGV4IElyRGEgKi8KCUFMSV9DTE9TRSgpOwoKfQoKdm9pZCBhbGk1MTJ4X3NldF9ydGMoaW50IGVuYWJsZWQsIHUxNiBpbywgdTggaXJxKQp7CglBTElfT1BFTigpOwoJQUxJX1NFTERFVig2KTsKCglhbGlfd3JpdGUoMHgzMCwgZW5hYmxlZD8xOjApOwoJaWYgKGVuYWJsZWQpIHsKCQlhbGlfd3JpdGUoMHg2MCwgaW8gPj4gOCk7CgkJYWxpX3dyaXRlKDB4NjEsIGlvICYgMHhmZik7CgkJYWxpX3dyaXRlKDB4NzAsIGlycSk7CgoJCWFsaV93cml0ZSgweGYwLCAweDAwKTsKCX0KCUFMSV9DTE9TRSgpOwp9Cgp2b2lkIGFsaTUxMnhfc2V0X2tiYyhpbnQgZW5hYmxlZCwgdTgga2JjX2lycSwgdTggbW91c2VfaXJxKQp7CglBTElfT1BFTigpOwoJQUxJX1NFTERFVig3KTsKCglhbGlfd3JpdGUoMHgzMCwgZW5hYmxlZD8xOjApOwoJaWYgKGVuYWJsZWQpIHsKCQlhbGlfd3JpdGUoMHg3MCwga2JjX2lycSk7CgkJYWxpX3dyaXRlKDB4NzIsIG1vdXNlX2lycSk7CgoJCWFsaV93cml0ZSgweGYwLCAweDAwKTsKCX0KCUFMSV9DTE9TRSgpOwp9CgoKLyogQ29tbW9uIEkvTwogKgogKiAoVGhpcyBkZXNjcmlwb3RzaW9uIGlzIGJhc2Ugb24gc2V2ZXJhbCBpbmNvbXBldGUgc291cmNlcwogKiAgc2luY2UgSSBoYXZlIG5vdCBiZWVuIGFibGUgdG8gb2J0YWluIGFueSBkYXRhc2hlZXQgZm9yIHRoZSBkZXZpY2UKICogIHRoZXJlIG1heSBiZSBzb21lIG1pcy11bmRlcnN0YW5kaW5ncyBidXJyaWVkIGluIGhlcmUuCiAqICAtLSBEYW5pZWwgZGFuaWVsQG9taWNyb24uc2UpCiAqCiAqIFRoZXJlIGFyZSAyMiBDSU8gcGlucyBudW1iZXJlZAogKiAxMC0xNwogKiAyMC0yNQogKiAzMC0zNwogKgogKiAyMC0yNCBhcmUgZGVkaWNhdGVkIENJTyBwaW5zLCB0aGUgb3RoZXIgMTcgYXJlIG11bGlwbGV4ZWQgd2l0aAogKiBvdGhlciBmdW5jdGlvbnMuCiAqCiAqICAgICAgICAgICBTZWNvbmRhcnkKICogQ0lPIFBpbiAgIEZ1bmN0aW9uICAgIERlY3JpcHRpb24KICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKiBDSU8xMCAgICAgSVJRSU4xICAgICAgSW50ZXJydXB0IGlucHV0IDE/CiAqIENJTzExICAgICBJUlFJTjIgICAgICBJbnRlcnJ1cHQgaW5wdXQgMj8KICogQ0lPMTIgICAgIElSUlggICAgICAgIElyRGEgUmVjZWl2ZQogKiBDSU8xMyAgICAgSVJUWCAgICAgICAgSXJEYSBUcmFuc21pdAogKiBDSU8xNCAgICAgUDIxICAgICAgICAgS0JDIFAyMSBmdWNudGlvbgogKiBDSU8xNSAgICAgUDIwICAgICAgICAgS0JDIFAyMSBmdWNudGlvbgogKiBDSU8xNiAgICAgSTJDX0NMSyAgICAgSTJDIENsb2NrCiAqIENJTzE3ICAgICBJMkNfREFUICAgICBJMkMgRGF0YQogKgogKiBDSU8yMCAgICAgLQogKiBDSU8yMSAgICAgLQogKiBDSU8yMiAgICAgLQogKiBDSU8yMyAgICAgLQogKiBDSU8yNCAgICAgLQogKiBDSU8yNSAgICAgTE9DSyAgICAgICAgS2V5bG9jawogKgogKiBDSU8zMCAgICAgS0JDX0NMSyAgICAgS2V5YmFvcmQgQ2xvY2sKICogQ0lPMzEgICAgIENTMEogICAgICAgIEdlbmVyYWwgQ2hpcCBTZWxlY3QgZGVjb2RlciBDUzBKCiAqIENJTzMyICAgICBDUzFKICAgICAgICBHZW5lcmFsIENoaXAgU2VsZWN0IGRlY29kZXIgQ1MxSgogKiBDSU8zMyAgICAgQUxUX0tDTEsgICAgQWx0ZXJuYXRpdmUgS2V5Ym9hcmQgQ2xvY2sKICogQ0lPMzQgICAgIEFMVF9LREFUICAgIEFsdGVybmF0aXZlIEtleWJvYXJkIERhdGEKICogQ0lPMzUgICAgIEFMVF9NQ0xLICAgIEFsdGVybmF0aXZlIE1vdXNlIENsb2NrCiAqIENJTzM2ICAgICBBTFRfTURBVCAgICBBbHRlcm5hdGl2ZSBNb3VzZSBEYXRhCiAqIENJTzM3ICAgICBBTFRfS0JDICAgICBBbHRlcm5hdGl2ZSBLQkMgc2VsZWN0CiAqCiAqIFRoZSBDSU8gdXNlIGFuIGluZGlyZWN0IGFkZHJlc3Mgc2NoZW1lLgogKgogKiBSZWlnc3RlciAzIGluIHRoZSBTSU8gaXMgdXNlZCB0byBzZWxlY3QgdGhlIGluZGV4IGFuZCBkYXRhCiAqIHBvcnQgYWRkcmVzc2VzIHdoZXJlIHRoZSBDSU8gSS9PIHJlZ2lzdGVycyBzaG93IHVwLgogKiBUaGUgZnVuY3Rpb24gc2VsZWN0aW9uIHJlZ2lzdGVycyBhcmUgYWNjZXNzaWJsZSB1bmRlcgogKiBmdW5jdGlvbiBTSU8gOC4KICoKICogU0lPIHJlaWdzdGVyIDMgKENJTyBBZGRyZXNzIFNlbGVjdGlvbikgYml0IGRlZmluaXRpb25zOgogKiBiaXQgNyAgIENJTyBpbmRleCBhbmQgZGF0YSByZWdpc3RlcnMgZW5hYmxlZAogKiBiaXQgMS0wIENJTyBpbmRpcmVjdCByZWdpc3RlcnMgcG9ydCBhZGRyZXNzIHNlbGVjdAogKiAgICAgCSAwICBpbmRleCA9IDB4RTAgZGF0YSA9IDB4RTEKICogICAgICAgMSAgaW5kZXggPSAweEUyIGRhdGEgPSAweEUzCiAqICAgICAgIDIgIGluZGV4ID0gMHhFNCBkYXRhID0gMHhFNQogKiAgICAgICAzICBpbmRleCA9IDB4RUEgZGF0YSA9IDB4RUIKICoKICogVGhlcmUgYXJlIHRocmVlIENJTyBJL08gcmVnaXN0ZXIgYWNjZXNzZWQgdmlhIENJTyBpbmRleCBwb3J0IGFuZCBDSU8gZGF0YSBwb3J0CiAqIDB4MDEgICAgIENJTyAxMC0xNyBkYXRhCiAqIDB4MDIgICAgIENJTyAyMC0yNSBkYXRhIChiaXRzIDctNiB1bnVzZWQpCiAqIDB4MDMgICAgIENJTyAzMC0zNyBkYXRhCiAqCiAqCiAqIFRoZSBwaW4gZnVuY3Rpb24gaXMgYWNjZXNzZWQgdGhyb3VnaCBub3JtYWwKICogU0lPIHJlZ2lzdGVycywgZWFjaCByZWdpc3RlciBoYXZlIHRoZSBzYW1lIGZvcm1hdDoKICoKICogQml0ICAgRnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICBWYWx1ZQogKiAwICAgICBJbnB1dC9vdXRwdXQgICAgICAgICAgICAgICAgIDE9aW5wdXQKICogMSAgICAgUG9sYXJpdHkgb2Ygc2lnbmFsICAgICAgICAgICAxPWludmVydGVkCiAqIDIgICAgIFVudXNlZCAgICAgICAgICAgICAgICAgICAgICAgPz8KICogMyAgICAgRnVuY3Rpb24gKG5vcm1hbCBvciBzcGVjaWFsKSAxPXNwZWNpYWwKICogNy00ICAgVW51c2VkCiAqCiAqIFNJTyBSRUcKICogMHhlMCAgICAgQ0lPIDEwIENvbmZpZwogKiAweGUxICAgICBDSU8gMTEgQ29uZmlnCiAqIDB4ZTIgICAgIENJTyAxMiBDb25maWcKICogMHhlMyAgICAgQ0lPIDEzIENvbmZpZwogKiAweGU0ICAgICBDSU8gMTQgQ29uZmlnCiAqIDB4ZTUgICAgIENJTyAxNSBDb25maWcKICogMHhlNiAgICAgQ0lPIDE2IENvbmZpZwogKiAweGU3ICAgICBDSU8gMTYgQ29uZmlnCiAqCiAqIDB4ZTggICAgIENJTyAyMCBDb25maWcKICogMHhlOSAgICAgQ0lPIDIxIENvbmZpZwogKiAweGVhICAgICBDSU8gMjIgQ29uZmlnCiAqIDB4ZWIgICAgIENJTyAyMyBDb25maWcKICogMHhlYyAgICAgQ0lPIDI0IENvbmZpZwogKiAweGVkICAgICBDSU8gMjUgQ29uZmlnCiAqCiAqIDB4ZjUgICAgIENJTyAzMCBDb25maWcKICogMHhmNiAgICAgQ0lPIDMxIENvbmZpZwogKiAweGY3ICAgICBDSU8gMzIgQ29uZmlnCiAqIDB4ZjggICAgIENJTyAzMyBDb25maWcKICogMHhmOSAgICAgQ0lPIDM0IENvbmZpZwogKiAweGZhICAgICBDSU8gMzUgQ29uZmlnCiAqIDB4ZmIgICAgIENJTyAzNiBDb25maWcKICogMHhmYyAgICAgQ0lPIDM3IENvbmZpZwogKgogKi8KCiNkZWZpbmUgQUxJX0NJT19QT1JUX1NFTCAweDgzCiNkZWZpbmUgQUxJX0NJT19JTkRFWCAgICAweGVhCiNkZWZpbmUgQUxJX0NJT19EQVRBICAgICAweGViCgp2b2lkIGFsaTUxMnhfc2V0X2NpbyhpbnQgZW5hYmxlZCkKewoJaW50IGk7CgoJQUxJX09QRU4oKTsKCglpZiAoZW5hYmxlZCkgewoJCWFsaV93cml0ZSgweDMsIEFMSV9DSU9fUE9SVF9TRUwpOyAgICAvKiBFbmFibGUgQ0lPIGRhdGEgcmVnaXN0ZXIgKi8KCX0gZWxzZSB7CgkJYWxpX3dyaXRlKDB4MywgQUxJX0NJT19QT1JUX1NFTCAmIH4weDgwKTsKCX0KCglBTElfU0VMREVWKDgpOwoKCWFsaV93cml0ZSgweDMwLCBlbmFibGVkPzE6MCk7CgoJLyogc2V0IGFsbCBwaW5zIHRvIGlucHV0IHRvIHN0YXJ0IHdpdGggKi8KCWZvciAoaT0weGUwO2k8MHhlZTtpKyspIHsKCQlhbGlfd3JpdGUoaSwgMSk7Cgl9CgoJZm9yIChpPTB4ZjU7aTwweGZlO2krKykgewoJCWFsaV93cml0ZShpLCAxKTsKCX0KCglBTElfQ0xPU0UoKTsKfQoKCnZvaWQgYWxpNTEyeF9jaW9fZnVuY3Rpb24oaW50IHBpbiwgaW50IHNwZWNpYWwsIGludCBpbnYsIGludCBpbnB1dCkKewoJdTggZGF0YTsKCXU4IGFkZHI7CgoJLyogdmFsaWQgcGlucyBhcmUgMTAtMTcsIDIwLTI1IGFuZCAzMC0zNyAqLwoJaWYgKHBpbiA+PSAxMCAmJiBwaW4gPD0gMTcpIHsKCQlhZGRyID0gMHhlMCsocGluJjcpOwoJfSBlbHNlIGlmIChwaW4gPj0gMjAgJiYgcGluIDw9IDI1KSB7CgkJYWRkciA9IDB4ZTgrKHBpbiY3KTsKCX0gZWxzZSBpZiAocGluID49IDMwICYmIHBpbiA8PSAzNykgewoJCWFkZHIgPSAweGY1KyhwaW4mNyk7Cgl9IGVsc2UgewoJCXJldHVybjsKCX0KCglBTElfT1BFTigpOwoKCUFMSV9TRUxERVYoOCk7CgoKCWRhdGE9MHhmNDsKCWlmIChzcGVjaWFsKSB7CgkJZGF0YSB8PSAweDA4OwoJfSBlbHNlIHsKCQlpZiAoaW52KSB7CgkJCWRhdGEgfD0gMHgwMjsKCQl9CgkJaWYgKGlucHV0KSB7CgkJCWRhdGEgfD0gMHgwMTsKCQl9Cgl9CgoJYWxpX3dyaXRlKGFkZHIsIGRhdGEpOwoKCUFMSV9DTE9TRSgpOwp9Cgp2b2lkIGFsaTUxMnhfY2lvX291dChpbnQgcGluLCBpbnQgdmFsdWUpCnsKCXU4IHJlZzsKCXU4IGRhdGE7Cgl1OCBiaXQ7CgoJcmVnID0gcGluLzEwOwoJYml0ID0gMSA8PCAocGluJTEwKTsKCgoJb3V0YihyZWcsIEFMSV9DSU9fSU5ERVgpOyAgICAgLyogc2VsZWN0IEkvTyByZWdpc3RlciAqLwoJZGF0YSA9IGluYihBTElfQ0lPX0RBVEEpOwoJaWYgKHZhbHVlKSB7CgkJZGF0YSB8PSBiaXQ7Cgl9IGVsc2UgewoJCWRhdGEgJj0gfmJpdDsKCX0KCW91dGIoZGF0YSwgQUxJX0NJT19EQVRBKTsKfQoKaW50IGFsaTUxMnhfY2lvX2luKGludCBwaW4pCnsKCXU4IHJlZzsKCXU4IGRhdGE7Cgl1OCBiaXQ7CgoJLyogdmFsaWQgcGlucyBhcmUgMTAtMTcsIDIwLTI1IGFuZCAzMC0zNyAqLwoJcmVnID0gcGluLzEwOwoJYml0ID0gMSA8PCAocGluJTEwKTsKCgoJb3V0YihyZWcsIEFMSV9DSU9fSU5ERVgpOyAgICAgLyogc2VsZWN0IEkvTyByZWdpc3RlciAqLwoJZGF0YSA9IGluYihBTElfQ0lPX0RBVEEpOwoKCXJldHVybiBkYXRhICYgYml0Owp9CgoKI2VuZGlmCg==