LyoKICAgIGkyYy1oeWRyYS5jIC0gUGFydCBvZiBsbV9zZW5zb3JzLCAgTGludXgga2VybmVsIG1vZHVsZXMKICAgICAgICAgICAgICAgICAgZm9yIGhhcmR3YXJlIG1vbml0b3JpbmcKCiAgICBpMmMgU3VwcG9ydCBmb3IgdGhlIEFwcGxlIGBIeWRyYScgTWFjIEkvTwoKICAgIENvcHlyaWdodCAoYykgMTk5OS0yMDA0IEdlZXJ0IFV5dHRlcmhvZXZlbiA8Z2VlcnRAbGludXgtbTY4ay5vcmc+CgogICAgQmFzZWQgb24gaTJjIFN1cHBvcnQgZm9yIFZpYSBUZWNobm9sb2dpZXMgODJDNTg2QiBTb3V0aCBCcmlkZ2UKICAgIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSBLefZzdGkgTeRsa2tpIDxrbWFsa2tpQGNjLmh1dC5maT4KCiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKi8KCiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgvcGNpLmg+CiNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgojaW5jbHVkZSA8bGludXgvaTJjLmg+CiNpbmNsdWRlIDxsaW51eC9pMmMtYWxnby1iaXQuaD4KI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KI2luY2x1ZGUgPGFzbS9pby5oPgojaW5jbHVkZSA8YXNtL2h5ZHJhLmg+CgoKI2RlZmluZSBIWURSQV9DUERfUEQwCTB4MDAwMDAwMDEJLyogQ2FjaGVQRCBsaW5lcyAqLwojZGVmaW5lIEhZRFJBX0NQRF9QRDEJMHgwMDAwMDAwMgojZGVmaW5lIEhZRFJBX0NQRF9QRDIJMHgwMDAwMDAwNAojZGVmaW5lIEhZRFJBX0NQRF9QRDMJMHgwMDAwMDAwOAoKI2RlZmluZSBIWURSQV9TQ0xLCUhZRFJBX0NQRF9QRDAKI2RlZmluZSBIWURSQV9TREFUCUhZRFJBX0NQRF9QRDEKI2RlZmluZSBIWURSQV9TQ0xLX09FCTB4MDAwMDAwMTAKI2RlZmluZSBIWURSQV9TREFUX09FCTB4MDAwMDAwMjAKCnN0YXRpYyBpbmxpbmUgdm9pZCBwZHJlZ3codm9pZCAqZGF0YSwgdTMyIHZhbCkKewoJc3RydWN0IEh5ZHJhICpoeWRyYSA9IChzdHJ1Y3QgSHlkcmEgKilkYXRhOwoJd3JpdGVsKHZhbCwgJmh5ZHJhLT5DYWNoZVBEKTsKfQoKc3RhdGljIGlubGluZSB1MzIgcGRyZWdyKHZvaWQgKmRhdGEpCnsKCXN0cnVjdCBIeWRyYSAqaHlkcmEgPSAoc3RydWN0IEh5ZHJhICopZGF0YTsKCXJldHVybiByZWFkbCgmaHlkcmEtPkNhY2hlUEQpOwp9CgpzdGF0aWMgdm9pZCBoeWRyYV9iaXRfc2V0c2NsKHZvaWQgKmRhdGEsIGludCBzdGF0ZSkKewoJdTMyIHZhbCA9IHBkcmVncihkYXRhKTsKCWlmIChzdGF0ZSkKCQl2YWwgJj0gfkhZRFJBX1NDTEtfT0U7CgllbHNlIHsKCQl2YWwgJj0gfkhZRFJBX1NDTEs7CgkJdmFsIHw9IEhZRFJBX1NDTEtfT0U7Cgl9CglwZHJlZ3coZGF0YSwgdmFsKTsKfQoKc3RhdGljIHZvaWQgaHlkcmFfYml0X3NldHNkYSh2b2lkICpkYXRhLCBpbnQgc3RhdGUpCnsKCXUzMiB2YWwgPSBwZHJlZ3IoZGF0YSk7CglpZiAoc3RhdGUpCgkJdmFsICY9IH5IWURSQV9TREFUX09FOwoJZWxzZSB7CgkJdmFsICY9IH5IWURSQV9TREFUOwoJCXZhbCB8PSBIWURSQV9TREFUX09FOwoJfQoJcGRyZWd3KGRhdGEsIHZhbCk7Cn0KCnN0YXRpYyBpbnQgaHlkcmFfYml0X2dldHNjbCh2b2lkICpkYXRhKQp7CglyZXR1cm4gKHBkcmVncihkYXRhKSAmIEhZRFJBX1NDTEspICE9IDA7Cn0KCnN0YXRpYyBpbnQgaHlkcmFfYml0X2dldHNkYSh2b2lkICpkYXRhKQp7CglyZXR1cm4gKHBkcmVncihkYXRhKSAmIEhZRFJBX1NEQVQpICE9IDA7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKc3RhdGljIHN0cnVjdCBpMmNfYWxnb19iaXRfZGF0YSBoeWRyYV9iaXRfZGF0YSA9IHsKCS5zZXRzZGEJCT0gaHlkcmFfYml0X3NldHNkYSwKCS5zZXRzY2wJCT0gaHlkcmFfYml0X3NldHNjbCwKCS5nZXRzZGEJCT0gaHlkcmFfYml0X2dldHNkYSwKCS5nZXRzY2wJCT0gaHlkcmFfYml0X2dldHNjbCwKCS51ZGVsYXkJCT0gNSwKCS5tZGVsYXkJCT0gNSwKCS50aW1lb3V0CT0gSFoKfTsKCnN0YXRpYyBzdHJ1Y3QgaTJjX2FkYXB0ZXIgaHlkcmFfYWRhcCA9IHsKCS5vd25lcgkJPSBUSElTX01PRFVMRSwKCS5uYW1lCQk9ICJIeWRyYSBpMmMiLAoJLmlkCQk9IEkyQ19IV19CX0hZRFJBLAoJLmFsZ29fZGF0YQk9ICZoeWRyYV9iaXRfZGF0YSwKfTsKCnN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBoeWRyYV9pZHNbXSA9IHsKCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0FQUExFLCBQQ0lfREVWSUNFX0lEX0FQUExFX0hZRFJBKSB9LAoJeyAwLCB9Cn07CgpNT0RVTEVfREVWSUNFX1RBQkxFIChwY2ksIGh5ZHJhX2lkcyk7CgpzdGF0aWMgaW50IF9fZGV2aW5pdCBoeWRyYV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqZGV2LAoJCQkJIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKewoJdW5zaWduZWQgbG9uZyBiYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgMCk7CglpbnQgcmVzOwoKCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKGJhc2Urb2Zmc2V0b2Yoc3RydWN0IEh5ZHJhLCBDYWNoZVBEKSwgNCwKCQkJCWh5ZHJhX2FkYXAubmFtZSkpCgkJcmV0dXJuIC1FQlVTWTsKCgloeWRyYV9iaXRfZGF0YS5kYXRhID0gaW9yZW1hcChiYXNlLCBwY2lfcmVzb3VyY2VfbGVuKGRldiwgMCkpOwoJaWYgKGh5ZHJhX2JpdF9kYXRhLmRhdGEgPT0gTlVMTCkgewoJCXJlbGVhc2VfbWVtX3JlZ2lvbihiYXNlK29mZnNldG9mKHN0cnVjdCBIeWRyYSwgQ2FjaGVQRCksIDQpOwoJCXJldHVybiAtRU5PREVWOwoJfQoKCXBkcmVndyhoeWRyYV9iaXRfZGF0YS5kYXRhLCAwKTsJCS8qIGNsZWFyIFNDTEtfT0UgYW5kIFNEQVRfT0UgKi8KCWh5ZHJhX2FkYXAuZGV2LnBhcmVudCA9ICZkZXYtPmRldjsKCXJlcyA9IGkyY19iaXRfYWRkX2J1cygmaHlkcmFfYWRhcCk7CglpZiAocmVzIDwgMCkgewoJCWlvdW5tYXAoaHlkcmFfYml0X2RhdGEuZGF0YSk7CgkJcmVsZWFzZV9tZW1fcmVnaW9uKGJhc2Urb2Zmc2V0b2Yoc3RydWN0IEh5ZHJhLCBDYWNoZVBEKSwgNCk7CgkJcmV0dXJuIHJlczsKCX0KCXJldHVybiAwOwp9CgpzdGF0aWMgdm9pZCBfX2RldmV4aXQgaHlkcmFfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCnsKCXBkcmVndyhoeWRyYV9iaXRfZGF0YS5kYXRhLCAwKTsJCS8qIGNsZWFyIFNDTEtfT0UgYW5kIFNEQVRfT0UgKi8KCWkyY19iaXRfZGVsX2J1cygmaHlkcmFfYWRhcCk7Cglpb3VubWFwKGh5ZHJhX2JpdF9kYXRhLmRhdGEpOwoJcmVsZWFzZV9tZW1fcmVnaW9uKHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIDApKwoJCQkgICBvZmZzZXRvZihzdHJ1Y3QgSHlkcmEsIENhY2hlUEQpLCA0KTsKfQoKCnN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBoeWRyYV9kcml2ZXIgPSB7CgkubmFtZQkJPSAiaHlkcmFfc21idXMiLAoJLmlkX3RhYmxlCT0gaHlkcmFfaWRzLAoJLnByb2JlCQk9IGh5ZHJhX3Byb2JlLAoJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChoeWRyYV9yZW1vdmUpLAp9OwoKc3RhdGljIGludCBfX2luaXQgaTJjX2h5ZHJhX2luaXQodm9pZCkKewoJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmh5ZHJhX2RyaXZlcik7Cn0KCgpzdGF0aWMgdm9pZCBfX2V4aXQgaTJjX2h5ZHJhX2V4aXQodm9pZCkKewoJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZoeWRyYV9kcml2ZXIpOwp9CgoKCk1PRFVMRV9BVVRIT1IoIkdlZXJ0IFV5dHRlcmhvZXZlbiA8Z2VlcnRAbGludXgtbTY4ay5vcmc+Iik7Ck1PRFVMRV9ERVNDUklQVElPTigiaTJjIGZvciBBcHBsZSBIeWRyYSBNYWMgSS9PIik7Ck1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKCm1vZHVsZV9pbml0KGkyY19oeWRyYV9pbml0KTsKbW9kdWxlX2V4aXQoaTJjX2h5ZHJhX2V4aXQpOwoK