LyoKCiAgcmRldi5jICAtICBxdWVyeS9zZXQgcm9vdCBkZXZpY2UuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpEYXRlOiBTdW4sIDI3IERlYyAxOTkyIDE1OjU1OjMxICswMDAwClN1YmplY3Q6IFJlOiByZGV2CkZyb206IGFsbWVzYmVyQG5lc3NpZS5jcy5pZC5ldGh6LmNoIChXZXJuZXIgQWxtZXNiZXJnZXIpClRvOiBSaWsgRmFpdGggPGZhaXRoQGNzLnVuYy5lZHU+CgpUaGVyZSBhcmUgcXVpdGUgYSBmZXcgdmVyc2lvbnMgb2YgcmRldjoKCiAgLSB0aGUgb3JpZ2luYWwgcm9vdGRldiB0aGF0IG9ubHkgcHJpbnRlZCB0aGUgY3VycmVudCByb290IGRldmljZSwgYnkKICAgIExpbnVzLgogIC0gcmRldiB0aGF0IGRvZXMgd2hhdCByb290ZGV2IGRpZCBhbmQgdGhhdCBhbHNvIGFsbG93cyB5b3UgdG8gY2hhbmdlCiAgICB0aGUgcm9vdCAoYW5kIHN3YXApIGRldmljZSwgYnkgbWUuCiAgLSByZGV2IGdvdCByZW5hbWVkIHRvIHNldHJvb3QgYW5kIEkgdGhpbmsgZXZlbiB0byByb290ZGV2IG9uIHZhcmlvdXMKICAgIGRpc3RyaWJ1dGlvbnMuCiAgLSBQZXRlciBNYWNEb25hbGQgYWRkZWQgdmlkZW8gbW9kZSBhbmQgUkFNIGRpc2sgc2V0dGluZyBhbmQgaW5jbHVkZWQKICAgIHRoaXMgdmVyc2lvbiBvbiBTTFMsIGNhbGxlZCByZGV2IGFnYWluLiBJJ3ZlIGF0dGFjaGVkIGhpcyByZGV2LmMgdG8KICAgIHRoaXMgbWFpbC4KICAgIAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAKRGF0ZTogMTEgTWFyIDkyIDIxOjM3OjM3IEdNVApTdWJqZWN0OiByZGV2IC0gcXVlcnkvc2V0IHJvb3QgZGV2aWNlCkZyb206IGFsbWVzYmVyQG5lc3NpZS5jcy5pZC5ldGh6LmNoIChXZXJuZXIgQWxtZXNiZXJnZXIpCk9yZ2FuaXphdGlvbjogU3dpc3MgRmVkZXJhbCBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSAoRVRIKSwgWnVyaWNoLCBDSAoKV2l0aCBhbGwgdGhhdCBzb2NrZXQsIFgxMSwgZGlzayBkcml2ZXIgYW5kIEZTIGhhY2tpbmcgZ29pbmcgb24sIGFwcGFyZW50bHkKbm9ib2R5IGhhcyBmb3VuZCB0aW1lIHRvIGFkZHJlc3Mgb25lIG9mIHRoZSBtaW5vciBudWlzYW5jZXMgb2YgbGlmZTogc2V0LQp0aW5nIHRoZSByb290IEZTIGRldmljZSBpcyBzdGlsbCBzb21ld2hhdCBjdW1iZXJzb21lLiBJJ3ZlIHdyaXR0ZW4gYSBsaXR0bGUKdXRpbGl0eSB3aGljaCBjYW4gcmVhZCBhbmQgc2V0IHRoZSByb290IGRldmljZSBpbiBib290IGltYWdlczoKCnJkZXYgYWNjZXB0cyBhbiBvcHRpb25hbCBvZmZzZXQgYXJndW1lbnQsIGp1c3QgaW4gY2FzZSB0aGUgYWRkcmVzcyBzaG91bGQKZXZlciBtb3ZlIGZyb20gNTA4LiBJZiBjYWxsZWQgd2l0aG91dCBhcmd1bWVudHMsIHJkZXYgb3V0cHV0cyBhbiBtdGFiIGxpbmUKZm9yIHRoZSBjdXJyZW50IHJvb3QgRlMsIGp1c3QgbGlrZSAvZXRjL3Jvb3RkZXYgZG9lcy4KCnJhbXNpemUgc2V0cyB0aGUgc2l6ZSBvZiB0aGUgcmFtZGlzay4gIElmIHNpemUgaXMgemVybywgbm8gcmFtZGlzayBpcyB1c2VkLgoKdmlkbW9kZSBzZXRzIHRoZSBkZWZhdWx0IHZpZGVvIG1vZGUgYXQgYm9vdHVwIHRpbWUuICAtMSB1c2VzIGRlZmF1bHQgdmlkZW8KbW9kZSwgLTIgdXNlcyBtZW51LgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKU3VuIERlYyAyNyAxMDo0MjoxNiAxOTkyOiBNaW5vciB1c2FnZSBjaGFuZ2VzLCBmYWl0aEBjcy51bmMuZWR1LgpUdWUgTWFyIDMwIDA5OjMxOjUyIDE5OTM6IHJkZXYgLVJuIHRvIHNldCByb290IHJlYWRvbmx5IGZsYWcsIHNjdEBkY3MuZWQuYWMudWsKV2VkIEp1biAyMiAyMToxMjoyOSAxOTk0OiBBcHBsaWVkIHBhdGNoZXMgZnJvbSBEYXZlCiAgICAgICAgICAgICAgICAgICAgICAgICAgKGdlbnR6ZWxAbm92YS5lbmV0LmRlYy5jb20pIHRvIHByZXZlbnQgZGVyZWZlcmVuY2luZwoJCQkgIHRoZSBOVUxMIHBvaW50ZXIsIGZhaXRoQGNzLnVuYy5lZHUKMTk5OS0wMi0yMiBBcmthZGl1c3ogTWm2a2lld2ljeiA8bWlzaWVrQHBsZC5PUkcuUEw+Ci0gYWRkZWQgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiovCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxjdHlwZS5oPgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgPGZjbnRsLmg+CiNpbmNsdWRlIDxkaXJlbnQuaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpbmNsdWRlIDxzeXMvc3RhdC5oPgoKI2luY2x1ZGUgIm5scy5oIgoKLyogcmRldi5jICAtICBxdWVyeS9zZXQgcm9vdCBkZXZpY2UuICovCgpzdGF0aWMgdm9pZAp1c2FnZSh2b2lkKSB7CgogICAgcHV0cyhfKCJ1c2FnZTogcmRldiBbIC1ydiBdIFsgLW8gT0ZGU0VUIF0gWyBJTUFHRSBbIFZBTFVFIFsgT0ZGU0VUIF0gXSBdIikpOwogICAgcHV0cyhfKCIgIHJkZXYgL2Rldi9mZDAgIChvciByZGV2IC9saW51eCwgZXRjLikgZGlzcGxheXMgdGhlIGN1cnJlbnQgUk9PVCBkZXZpY2UiKSk7CiAgICBwdXRzKF8oIiAgcmRldiAvZGV2L2ZkMCAvZGV2L2hkYTIgICAgICAgICBzZXRzIFJPT1QgdG8gL2Rldi9oZGEyIikpOwogICAgcHV0cyhfKCIgIHJkZXYgLVIgL2Rldi9mZDAgMSAgICAgICAgICAgICAgc2V0IHRoZSBST09URkxBR1MgKHJlYWRvbmx5IHN0YXR1cykiKSk7CiAgICBwdXRzKF8oIiAgcmRldiAtciAvZGV2L2ZkMCA2MjcgICAgICAgICAgICBzZXQgdGhlIFJBTURJU0sgc2l6ZSIpKTsKICAgIHB1dHMoXygiICByZGV2IC12IC9kZXYvZmQwIDEgICAgICAgICAgICAgIHNldCB0aGUgYm9vdHVwIFZJREVPTU9ERSIpKTsKICAgIHB1dHMoXygiICByZGV2IC1vIE4gLi4uICAgICAgICAgICAgICAgICAgIHVzZSB0aGUgYnl0ZSBvZmZzZXQgTiIpKTsKICAgIHB1dHMoXygiICByb290ZmxhZ3MgLi4uICAgICAgICAgICAgICAgICAgIHNhbWUgYXMgcmRldiAtUiIpKTsKICAgIHB1dHMoXygiICByYW1zaXplIC4uLiAgICAgICAgICAgICAgICAgICAgIHNhbWUgYXMgcmRldiAtciIpKTsKICAgIHB1dHMoXygiICB2aWRtb2RlIC4uLiAgICAgICAgICAgICAgICAgICAgIHNhbWUgYXMgcmRldiAtdiIpKTsKICAgIHB1dHMoXygiTm90ZTogdmlkZW8gbW9kZXMgYXJlOiAtMz1Bc2ssIC0yPUV4dGVuZGVkLCAtMT1Ob3JtYWxWZ2EsIDE9a2V5MSwgMj1rZXkyLC4uLiIpKTsKICAgIHB1dHMoXygiICAgICAgdXNlIC1SIDEgdG8gbW91bnQgcm9vdCByZWFkb25seSwgLVIgMCBmb3IgcmVhZC93cml0ZS4iKSk7CiAgICBleGl0KC0xKTsKfQoKCiNkZWZpbmUgREVGQVVMVF9PRkZTRVQgNTA4CgoKc3RhdGljIHZvaWQKZGllKGNoYXIgKm1zZykgewoJcGVycm9yKG1zZyk7CglleGl0KDEpOwp9CgovKiBFYXJsaWVyIHJkZXYgZmFpbHMgb24gL2Rldi9pZGEvYzBkMHAxIHNvIHdlIGFsbG93IGZvcgogICByZWN1cnNpb24gaW4gL2Rldi4gLS0gUGF1bCBDbGVtZW50cyAqLwovKiBJbiBmYWN0IGRldmZzIG5lZWRzIGRlZXAgcmVjdXJzaW9uLiAqLwoKc3RhdGljIGludApmaW5kX2Rldl9yZWN1cnNpdmUoY2hhciAqZGlybmFtZWJ1ZiwgaW50IG51bWJlcikgewoJRElSICpkcDsKCXN0cnVjdCBkaXJlbnQgKmRpcjsKCXN0cnVjdCBzdGF0IHM7CglpbnQgZGlybmFtZWxlbiA9IDA7CgoJaWYgKChkcCA9IG9wZW5kaXIoZGlybmFtZWJ1ZikpID09IE5VTEwpCgkJZGllKCJvcGVuZGlyIik7CglkaXJuYW1lbGVuID0gc3RybGVuKGRpcm5hbWVidWYpOwoJd2hpbGUgKChkaXIgPSByZWFkZGlyKGRwKSkgIT0gTlVMTCkgewoJCWlmICghc3RyY21wKGRpci0+ZF9uYW1lLCAiLiIpIHx8ICFzdHJjbXAoZGlyLT5kX25hbWUsICIuLiIpKQoJCQljb250aW51ZTsKCQlpZiAoZGlybmFtZWxlbiArIDEgKyBzdHJsZW4oZGlyLT5kX25hbWUpID4gUEFUSF9NQVgpCgkJCWNvbnRpbnVlOwoJCWRpcm5hbWVidWZbZGlybmFtZWxlbl0gPSAnLyc7CgkJc3RyY3B5KGRpcm5hbWVidWYrZGlybmFtZWxlbisxLCBkaXItPmRfbmFtZSk7CgkJaWYgKGxzdGF0KGRpcm5hbWVidWYsICZzKSA8IDApCgkJCWNvbnRpbnVlOwoJCWlmICgocy5zdF9tb2RlICYgU19JRk1UKSA9PSBTX0lGQkxLICYmIHMuc3RfcmRldiA9PSBudW1iZXIpCgkJCXJldHVybiAxOwoJCWlmICgocy5zdF9tb2RlICYgU19JRk1UKSA9PSBTX0lGRElSICYmCgkJICAgIGZpbmRfZGV2X3JlY3Vyc2l2ZShkaXJuYW1lYnVmLCBudW1iZXIpKQoJCQlyZXR1cm4gMTsKCX0KCWRpcm5hbWVidWZbZGlybmFtZWxlbl0gPSAwOwoJY2xvc2VkaXIoZHApOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBjaGFyICoKZmluZF9kZXYoaW50IG51bWJlcikgewoJc3RhdGljIGNoYXIgbmFtZVtQQVRIX01BWCsxXTsKCglpZiAoIW51bWJlcikKCQlyZXR1cm4gIkJvb3QgZGV2aWNlIjsKCXN0cmNweShuYW1lLCAiL2RldiIpOwoJaWYgKGZpbmRfZGV2X3JlY3Vyc2l2ZShuYW1lLCBudW1iZXIpKQoJCXJldHVybiBuYW1lOwoJc3ByaW50ZihuYW1lLCAiMHglMDR4IiwgbnVtYmVyKTsKCXJldHVybiBuYW1lOwp9CgovKiBUaGUgZW51bSB2YWx1ZXMgYXJlIHNpZ25pZmljYW50LCB0aGluZ3MgYXJlIHN0b3JlZCBpbiB0aGlzIG9yZGVyLAogICBzZWUgYm9vdHNlY3QuUyAqLwplbnVtIHsgUkRFViwgVklETU9ERSwgUkFNU0laRSwgX19zd2FwZGV2X18sIF9fc3lzc2l6ZV9fLCBST09URkxBR1MgfTsKY2hhciAqY21kbmFtZXNbNl0gPSB7ICJyZGV2IiwgInZpZG1vZGUiLCAgInJhbXNpemUiLCAiIiwgCgkJICAgICAgIiIsICJyb290ZmxhZ3MifTsKY2hhciAqZGVzY1s2XSA9IHsgIlJvb3QgZGV2aWNlIiwgIlZpZGVvIG1vZGUiLCAgIlJhbXNpemUiLCAgIiIsCgkJICAiIiwgIlJvb3QgZmxhZ3MifTsKI2RlZmluZSBzaGlmdChuKSBhcmd2Kz1uLGFyZ2MtPW4KCmludAptYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgewoJaW50IGltYWdlLCBvZmZzZXQsIGRldl9uciwgaSwgbmV3b2Zmc2V0PS0xOwoJY2hhciAqcHRyOwoJdW5zaWduZWQgc2hvcnQgdmFsLCBoYXZlX3ZhbDsKCXN0cnVjdCBzdGF0IHM7CglpbnQgY21kOwoKCXNldGxvY2FsZShMQ19BTEwsICIiKTsKCWJpbmR0ZXh0ZG9tYWluKFBBQ0tBR0UsIExPQ0FMRURJUik7Cgl0ZXh0ZG9tYWluKFBBQ0tBR0UpOwoKCS8qIHVzZSB0aGUgY29tbWFuZCBuYW1lIHRvIGZpZ3VyZSBvdXQgd2hhdCB3ZSBoYXZlIHRvIGRvIC0gdWdseSAqLwoJY21kID0gUkRFVjsKCWlmICgocHRyID0gc3RycmNocihhcmd2WzBdLCcvJykpICE9IE5VTEwpCgkJcHRyKys7CgllbHNlCgkJcHRyID0gYXJndlswXTsKCWZvciAoaT0wOyBpPD01OyBpKyspIHsKCQlpZiAoIXN0cmNtcChwdHIsY21kbmFtZXNbaV0pKSB7CgkJCWNtZCA9IGk7CgkJCWJyZWFrOwoJCX0KCX0KCgl3aGlsZSAoYXJnYyA+IDEpIHsgCgkJaWYgKGFyZ3ZbMV1bMF0gIT0gJy0nKQoJCQlicmVhazsKCQlzd2l0Y2ggKGFyZ3ZbMV1bMV0pIHsKCQljYXNlICdSJzoKCQkJY21kID0gUk9PVEZMQUdTOwoJCQlzaGlmdCgxKTsKCQkJYnJlYWs7CgkJY2FzZSAncic6IAoJCQljbWQgPSBSQU1TSVpFOwoJCQlzaGlmdCgxKTsKCQkJYnJlYWs7CgkJY2FzZSAndic6CgkJCWNtZCA9IFZJRE1PREU7CgkJCXNoaWZ0KDEpOwoJCQlicmVhazsKCQljYXNlICdvJzoKCQkJaWYgKGFyZ3ZbMV1bMl0pIHsKCQkJCW5ld29mZnNldCA9IGF0b2koYXJndlsxXSsyKTsKCQkJCXNoaWZ0KDEpOwoJCQkJYnJlYWs7CgkJCX0gZWxzZSBpZiAoYXJnYyA+IDIpIHsKCQkJCW5ld29mZnNldCA9IGF0b2koYXJndlsyXSk7CgkJCQlzaGlmdCgyKTsKCQkJCWJyZWFrOwoJCQl9CgkJCS8qIEZhbGwgdGhyb3VnaC4gLiAuICovCgkJZGVmYXVsdDoKCQkJdXNhZ2UoKTsKCQl9Cgl9CgoJLyogSGVyZSB0aGUgb25seSBzZW5zaWJsZSB3YXkgb2YgdXNpbmcgcmRldiAqLwoJaWYgKGFyZ2MgPT0gMSkgewoJCWlmIChjbWQgPT0gUkRFVikgewoJCQlpZiAoc3RhdCgiLyIsJnMpIDwgMCkgZGllKCIvIik7CgkJCXByaW50ZigiJXMgL1xuIiwgZmluZF9kZXYocy5zdF9kZXYpKTsKCQkJZXhpdCgwKTsKCQl9CgkJdXNhZ2UoKTsKCX0KCglpZiAoYXJnYyA+IDQpCgkJdXNhZ2UoKTsKCgkvKiBBbmNpZW50IGdhcmJhZ2UuLiAqLwoJb2Zmc2V0ID0gREVGQVVMVF9PRkZTRVQtY21kKjI7CglpZiAobmV3b2Zmc2V0ID49IDApCgkJb2Zmc2V0ID0gbmV3b2Zmc2V0OwoJaWYgKGFyZ2MgPT0gNCkKCQlvZmZzZXQgPSBhdG9pKGFyZ3ZbM10pOwoKCWhhdmVfdmFsID0gMDsKCglpZiAoYXJnYyA+PSAzKSB7CgkJaWYgKGNtZCA9PSBSREVWKSB7CgkJCWlmIChpc2RpZ2l0KCphcmd2WzJdKSkgewoJCQkJLyogZWFybGllcjogc3BlY2lmeSBvZmZzZXQgKi8KCQkJCS8qIG5vdzogc3BlY2lmeSBtYWpvcixtaW5vciAqLwoJCQkJY2hhciAqcDsKCQkJCXVuc2lnbmVkIGludCBtYSxtaTsKCQkJCWlmICgocCA9IHN0cmNocihhcmd2WzJdLCAnLCcpKSA9PSBOVUxMKQoJCQkJCWRpZShfKCJtaXNzaW5nIGNvbW1hIikpOwoJCQkJbWEgPSBhdG9pKGFyZ3ZbMl0pOwoJCQkJbWkgPSBhdG9pKHArMSk7CgkJCQl2YWwgPSAoKG1hPDw4KSB8IG1pKTsKCQkJfSBlbHNlIHsKCQkJCWNoYXIgKmRldmljZSA9IGFyZ3ZbMl07CgkJCQlpZiAoc3RhdChkZXZpY2UsJnMpIDwgMCkKCQkJCQlkaWUoZGV2aWNlKTsKCQkJCXZhbCA9IHMuc3RfcmRldjsKCQkJfQoJCX0gZWxzZSB7CgkJCXZhbCA9IGF0b2koYXJndlsyXSk7CgkJfQoJCWhhdmVfdmFsID0gMTsKCX0KCglpZiAoaGF2ZV92YWwpIHsKCQlpZiAoKGltYWdlID0gb3Blbihhcmd2WzFdLE9fV1JPTkxZKSkgPCAwKSBkaWUoYXJndlsxXSk7CgkJaWYgKGxzZWVrKGltYWdlLG9mZnNldCwwKSA8IDApIGRpZSgibHNlZWsiKTsKCQlpZiAod3JpdGUoaW1hZ2UsKGNoYXIgKikmdmFsLDIpICE9IDIpIGRpZShhcmd2WzFdKTsKCQlpZiAoY2xvc2UoaW1hZ2UpIDwgMCkgZGllKCJjbG9zZSIpOwoJfSBlbHNlIHsKCQlpZiAoKGltYWdlID0gb3Blbihhcmd2WzFdLE9fUkRPTkxZKSkgPCAwKSBkaWUoYXJndlsxXSk7CgkJaWYgKGxzZWVrKGltYWdlLG9mZnNldCwwKSA8IDApIGRpZSgibHNlZWsiKTsKCQlkZXZfbnIgPSAwOwoJCWlmIChyZWFkKGltYWdlLChjaGFyICopJmRldl9uciwyKSAhPSAyKSBkaWUoYXJndlsxXSk7CgkJaWYgKGNsb3NlKGltYWdlKSA8IDApIGRpZSgiY2xvc2UiKTsKCQlmcHV0cyhkZXNjW2NtZF0sIHN0ZG91dCk7CgkJaWYgKGNtZCA9PSBSREVWKQoJCQlwcmludGYoIiAlc1xuIiwgZmluZF9kZXYoZGV2X25yKSk7CgkJZWxzZQoJCQlwcmludGYoIiAlZFxuIiwgZGV2X25yKTsKCX0KCXJldHVybiAwOwp9Cg==