LyogY21kX2Jvb3RhLmMgLCBBS0EgdGhlIEFPUyA0LnggcHJpbWFyeSBib290bG9hZGVyLgogICBJZGVhLCBkZXNpZ24gYW5kIChicm9rZW4pIGNvZGUgYnkgQW5kcmVhIFZhbGxpbm90dG8uCiAgIEhhdmUgZnVuLCBoYXZlIHBob25lLCBoYXZlIGd1biwgZXRjLi4uCiovCgojaW5jbHVkZSA8Y29tbW9uLmg+CiNpbmNsdWRlIDxjb21tYW5kLmg+CiNpbmNsdWRlICJjbWRfYm9vdGEuaCIKI2luY2x1ZGUgInN5c19kZXAuaCIKI2luY2x1ZGUgInNsYi9zYmxfZXJyY29kZXMuaCIgLy9Gb3IgdGhlIGVycm9yIGNvZGVzLgojaW5jbHVkZSA8bWFsbG9jLmg+CiNpbmNsdWRlICJuZXQuaCIKI2luY2x1ZGUgPC4uL25ldC90ZnRwLmg+CiNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiNpbmNsdWRlIDxhc20vaW8uaD4KI2luY2x1ZGUgPGFzbS9tbXUuaD4KI2luY2x1ZGUgPGFzbS80eHhfcGNpZS5oPgojaW5jbHVkZSA8YXNtL2dwaW8uaD4KCiN1bmRlZiBERUJVRwojaWZkZWYgREVCVUcKI2RlZmluZSBQUklOVEYoZm10LGFyZ3MuLi4pCXByaW50ZiAoZm10ICwjI2FyZ3MpCiNlbHNlCiNkZWZpbmUgUFJJTlRGKGZtdCxhcmdzLi4uKQojZW5kaWYKCiNkZWZpbmUgTUFYX0JMT0NLU0laRSAzMjc2OCAvL1RoaXMgaXMgdGhlIFBIWVNJQ0FMIHNpemUsIG5vdCBsb2dpY2FsISEKI2RlZmluZSBFTlZfVkFSX0JVRkxFTiAyNTYKCmV4dGVybiBpbnQgY29uc29sZV9jb2w7IC8qIGN1cnNvciBjb2wgKi8KZXh0ZXJuIGludCBjb25zb2xlX3JvdzsgLyogY3Vyc29yIHJvdyAqLwoKc3RhdGljIGNoYXIgKiBibG9ja2J1ZmZlciA7IC8vSU8gYnVmZmVyIHVzZWQgbWFueSB0aW1lcy4KCnN0YXRpYyB2b2lkIGludGVycHJldF9zYmxfZmFpbHVyZShjb25zdCBXT1JEIGVycikKICAgICAvKiBDb2RlcyBhcmUgYXMgZm9sbG93czoKCShzZWUgc2xiL3NibC5oKQogICAgICovCnsKCWNoYXIgKiBzdHJpbmdvdXQ7CgoJc3dpdGNoKGVycikKCXsKCQljYXNlIFNCTF9DT1VMRE5UX0lOSVQ6CgkJCXN0cmluZ291dCA9ICJDb3VsZG4ndCBpbml0aWFsaXplIHNlY29uZC1sZXZlbCBib290bG9hZGVyIChvdXQgb2YgbWVtb3J5ID8pLlxuIjsKCQkJYnJlYWs7CgoJCWNhc2UgU0JMX1BST1RPQ09MX1RPT19PTEQ6CgkJCXN0cmluZ291dCA9ICJTZWNvbmQgbGV2ZWwgYm9vdGxvYWRlciBpcyB0b28gb2xkOyBwbGVhc2UgdXBncmFkZSBpdC5cbiI7CgkJCWJyZWFrOwoKCQljYXNlIFNCTF9QUk9UT0NPTF9UT09fTkVXOgoJCQlzdHJpbmdvdXQgPSAiU2Vjb25kIGxldmVsIGJvb3Rsb2FkZXIgcmVxdWlyZXMgYSBuZXdlciBCSU9TIHZlcnNpb247IHBsZWFzZSB1cGdyYWRlLlxuIjsKCQkJYnJlYWs7CgoJCWNhc2UgU0JMX05PX0NPTkZJR19GSUxFU19GT1VORDoKCQkJc3RyaW5nb3V0ID0gIk5vIGNvbmZpZ3VyYXRpb24gZmlsZSBmb3VuZCBpbiBhbnkgcGFydGl0aW9ucy5cbiI7CgkJCWJyZWFrOwoKCQljYXNlIFNCTF9GQUlMRURfTE9BRElOR19LRVJORUxfSU1BR0U6CgkJCXN0cmluZ291dCA9ICJGYWlsZWQgbG9hZGluZyBrZXJuZWwgKG9yIGtpY2tzdGFydCkgaW1hZ2UgZmlsZShzKS5cbiI7CgkJCWJyZWFrOwoKCQljYXNlIFNCTF9VTktOT1dOX0VSUk9SOgoJCWRlZmF1bHQ6CgkJCXN0cmluZ291dCA9ICJVbmtub3duIHJldHVybiBjb2RlIGZyb20gc2Vjb25kYXJ5IGJvb3Rsb2FkZXIuXG4iOwoJCQlicmVhazsKCX0KCQoJcHJpbnRmKHN0cmluZ291dCk7Cn0KCnN0YXRpYyBCT09MIGdvb2RfY2hlY2tzdW0oY29uc3QgTE9ORyAqIGJsLCBjb25zdCBVV09SRCBsZW4pCnsKCVVMT05HIGNoc3VtPTA7CglVV09SRCBjbnQ7CgoJZm9yKGNudD0wO2NudDxsZW47Y250KyspCgkJY2hzdW0rPSpibCsrOwoKCXJldHVybiAoQk9PTCkoY2hzdW09PTApOwp9CgpzdGF0aWMgQk9PTCBpc19nb29kX2Jvb3RzZWN0b3IoY29uc3Qgc3RydWN0IEJvb3RzdHJhcENvZGVCbG9jayAqIGNvbnN0IGJjYiwKCQkJY29uc3QgdW5zaWduZWQgbG9uZyBibG9ja3NpemUpCnsKCS8vcHJpbnRmKCJFbnRlcmVkIGlzX2dvb2RfYi5cbiIpOwoJaWYoYmNiLT5iY2JfSUQgPT0gSUROQU1FX0JPT1RTVFJBUENPREUpCgl7CgkJaWYoYmNiLT5iY2JfU3VtbWVkTG9uZ3MgPD0gKGJsb2Nrc2l6ZT4+MikpCgkJewoJCQlpZihnb29kX2NoZWNrc3VtKChjb25zdCBMT05HICogY29uc3QpYmNiLCBiY2ItPmJjYl9TdW1tZWRMb25ncykpCgkJCSAgICByZXR1cm4gVFJVRTsKCQkJZWxzZSAKCQkJewoJCQkgICAgZ3Bpb19jb25maWcoMzAsIEdQSU9fT1VULCBHUElPX1NFTCwgR1BJT19PVVRfMSk7CgkJCSAgICBwcmludGYoIkJhZCBjaGVja3N1bSB3aGlsZSByZWFkaW5nIHNlY29uZCBsZXZlbCBib290bG9hZGVyXG4iKTsKCQkJfQoJCX0KCQllbHNlIHByaW50ZigiQmFkIGJsb2NrIHN0cnVjdHVyZSB3aGlsZSByZWFkaW5nIHNlY29uZCBsZXZlbCBib290bG9hZGVyOiBzdW1tZWRsb25ncyBub3QgZ29vZDogJWx1IGluc3RlYWQgb2YgJWx1XG4iLCBiY2ItPmJjYl9TdW1tZWRMb25ncywgYmxvY2tzaXplPj4yKTsKCX0KCS8vIGVsc2UgcHJpbnRmKCJCYWQgaWRlbnRpZmllclxuIik7CgkvL2JjYl9OZXh0IGlzIG5vdCBjaGVja2VkLiBUb28gY29tcGxleC4KCglyZXR1cm4gRkFMU0U7Cn0KCnN0YXRpYyBVTE9ORyBmaW5kX3NlY29uZGFyeV9ib290bG9hZGVyX3N0YXJ0X0hEKGNvbnN0IHVuc2lnbmVkIGxvbmcgYmxvY2tzaXplKQp7CglVTE9ORyBjdXJyc2VjID0gMDsKCglQUklOVEYoIkVudGVyZWQgZmluZF9zZWNfYmxfc3RhcnQgJWQgJXBcbiIsYmxvY2tzaXplLGJsb2NrYnVmZmVyKTsKCQoJaWYgKCAhIGJsb2Nrc2l6ZSkgcmV0dXJuIChVTE9ORyktMTsKCWlmICggISBibG9ja2J1ZmZlcikgcmV0dXJuIChVTE9ORyktMTsKICAgCgl3aGlsZShsb2Fkc2VjdG9yKGN1cnJzZWMsIGJsb2Nrc2l6ZSwgMSwgYmxvY2tidWZmZXIpKQoJewoJCVBSSU5URigiUmVhZGluZyBzZWN0b3IgJWx1XG4iLCBjdXJyc2VjKTsKCgkJaWYoaXNfZ29vZF9ib290c2VjdG9yKChzdHJ1Y3QgQm9vdHN0cmFwQ29kZUJsb2NrICopYmxvY2tidWZmZXIsIGJsb2Nrc2l6ZSkpCgkJCXJldHVybiBjdXJyc2VjOwoKCQkvKiBwcmludGYoIlNlY3RvciAlbHUgaXMgYmFkOiBzaWduYXR1cmUgaXMgJWx4IChzaG91bGQgYmUgJXgpXG4iLCBjdXJyc2VjLAoJICAgICAgICooKFVMT05HICopYmxvY2tidWZmZXIpLCBJRE5BTUVfQk9PVFNUUkFQQ09ERSk7CgkJKi8KCQlpZigrK2N1cnJzZWMgPiBTQkxfSElHSEVTVCkKCQkJcmV0dXJuIChVTE9ORyktMTsKCX0KCVBSSU5URigiTG9hZHNlY3RvciBmYWlsZWRcbiIpOwoKCXJldHVybiAoVUxPTkcpLTE7IC8vVGhpcyBtZWFucyBhIHJlYWQgZXJyb3IuCn0KCnN0YXRpYyBVTE9ORyBzZWNvbmRhcnlfYm9vdGxvYWRlcl9sZW5ndGgoVUxPTkcgc3RhcnRfc2VjdCwgY29uc3QgVVdPUkQgYmxvY2tzaXplLCBVTE9ORyAqIGNvbnN0IGRlc3RfbGVuKQp7CglVTE9ORyBuZXh0ID0gc3RhcnRfc2VjdCwgcmVzPTA7CglCT09MIHJlYWRyZXM7CglzdHJ1Y3QgQm9vdHN0cmFwQ29kZUJsb2NrICogYmNiID0gKHN0cnVjdCBCb290c3RyYXBDb2RlQmxvY2sgKilibG9ja2J1ZmZlcjsKCglkbwl7CgkJcmVhZHJlcyA9IGxvYWRzZWN0b3IobmV4dCwgYmxvY2tzaXplLCAxLCBibG9ja2J1ZmZlcik7CgoJCWlmKCFyZWFkcmVzKQoJCXsKCQkJLy9wcmludGYoIkJhZCBJTyB3aGlsZSBjb3VudGluZyBzZWN0b3JzIGZvciB0aGUgcy5ib290bG9hZGVyIGltYWdlLlxuIik7CgkJCSpkZXN0X2xlbiA9IHJlczsKCQkJcmV0dXJuIChSRUFEX0VSUk9SfChuZXh0ICYgMHhmZmZmKSk7CgkJfQoKCQlpZighaXNfZ29vZF9ib290c2VjdG9yKChzdHJ1Y3QgQm9vdHN0cmFwQ29kZUJsb2NrICopYmxvY2tidWZmZXIsIGJsb2Nrc2l6ZSkpCgkJCXJldHVybiAoUkVBRF9TWU5UQVhfRVJSfG5leHQpOwoKCQkvKgoJCSAgaWYocmVzID09IDApIC8vRmlyc3Qgc2VjdG9yID8gVGhlbiByZWNvcmQgc3RhcnQgYWRkcmVzcyAoZmlyc3QgbG9uZ3dvcmQpCgkJICB7CgkJICAgIHN0cnVjdCBCb290c3RyYXBDb2RlQmxvY2sgKiBoZWxwZXIgPSBibG9ja2J1ZmZlcjsKCQkgICAgKnN0YXJ0X2FkZHJlc3MgPSBoZWxwZXItPmJjYl9Mb2FkRGF0YVswXTsgLy9GaXJzdCBsb25nd29yZCBvZiBmaXJzdCBibG9jay4KCQkgIH0KCQkqLwoJCXJlcysrOwoJfQoJd2hpbGUoKG5leHQ9YmNiLT5iY2JfTmV4dCkgIT0gVU5VU0VEX0JMT0NLX0FERFJFU1MpOwoKCXJlcy0tOyAvLyBFeGNsdWRlcyBsYXN0IHNlY3Rvci4KCXJlcyAqPSAoYmxvY2tzaXplIC0gSEVBREVSX0lORk9fU0laRSk7IC8vIC0yMCBpcyB0byBleGNsdWRlIGhlYWRlciBpbmZvcm1hdGlvbi4KCXJlcyArPSAoKGJjYi0+YmNiX1N1bW1lZExvbmdzPDwyKSAtIEhFQURFUl9JTkZPX1NJWkUpOyAvL0xhc3Qgc2VjdG9yLgoKCSpkZXN0X2xlbiA9IHJlczsKCXJldHVybiBMT0FEX09LOwp9CgpzdGF0aWMgdm9pZCBsb2FkX3NlY29uZGFyeV9ib290bG9hZGVyKFVMT05HIHN0YXJ0X3NlY3QsIGNoYXIgKiBkZXN0X2J1ZmZlciwgY29uc3QgVVdPUkQgYmxvY2tzaXplLAoJCQkJICAgICAgY29uc3QgVUxPTkcgbGVuKQp7CgkvKiBObyBlcnJvciBjaGVjayBpcyBtYWRlLCBzbyBiZSBjYXJlZnVsIGV2ZXJ5dGhpbmcncyBvayBiZWZvcmUgY2FsbGluZyAqLwoJVUxPTkcgbmV4dHNlYz1zdGFydF9zZWN0LCBjaHVua2xlbjsKCWNoYXIgKiBjb3B5c3RhcnQgPSBibG9ja2J1ZmZlciArIEhFQURFUl9JTkZPX1NJWkU7CglVTE9ORyAqIGN1cnJlbnQgPSAoVUxPTkcgKilkZXN0X2J1ZmZlcjsKCXN0cnVjdCBCb290c3RyYXBDb2RlQmxvY2sgKiBiY2IgPSAoc3RydWN0IEJvb3RzdHJhcENvZGVCbG9jayAqKWJsb2NrYnVmZmVyOwoKCWRvCgl7CgkJbG9hZHNlY3RvcihuZXh0c2VjLCBibG9ja3NpemUsIDEsIGJsb2NrYnVmZmVyKTsKCQkvL2xwcmludGYoIlJlYWRpbmcgc2VjdG9yICVsdSBmb3IgbHNlZyBpbWFnZVxuIiwgbmV4dHNlYyk7CgkJLy9teWNvcHltZW0oY29weXN0YXJ0LCAoY2hhciAqKWN1cnJlbnQsIChjaHVua2xlbj1iY2ItPmJjYl9TdW1tZWRMb25ncy0oSEVBREVSX0lORk9fU0laRT4+MikpPDwyKTsKCQltZW1jcHkoKGNoYXIgKiljdXJyZW50LCBjb3B5c3RhcnQsIChjaHVua2xlbj1iY2ItPmJjYl9TdW1tZWRMb25ncy0oSEVBREVSX0lORk9fU0laRT4+MikpPDwyKTsKCQljdXJyZW50Kz1jaHVua2xlbjsKICAgfQoJd2hpbGUoKG5leHRzZWM9YmNiLT5iY2JfTmV4dCkgIT0gVU5VU0VEX0JMT0NLX0FERFJFU1MpOwp9CgpzdGF0aWMgdm9pZCBzdGFydF9zZWNvbmRhcnlfYm9vdGxvYWRlcih2b2lkICogc3RhcnQsIHN0cnVjdCBzYmxfY2FsbGJhY2tfY29udGV4dCAqIGNvbnRleHQpCnsKCVdPUkQgKCogYmxzKShzdHJ1Y3Qgc2JsX2NhbGxiYWNrX2NvbnRleHQgKik7CgkvL3ZvaWQgKiByZWFsc3RhcnQgPSAoKGNoYXIgKilzdGFydCkrNDsgLy9UbyBza2lwIHRoZSBoZWFkZXIuIFJlbW92ZSBmb3IgZmluYWwgdmVyc2lvbi4KCS8vKChjaGFyICopc3RhcnQpK29mZnNldDsKCXVuc2lnbmVkIGxvbmcgZW50cnlwb2ludDsKCVdPUkQgcmVzdWx0OwoKCS8vaWNhY2hlX2VuYWJsZSgpOwoJLy9wcmludGYoIlNlY29uZC1sZXZlbCBib290bG9hZGVyIGxvYWRlZCBhdCAlcDsgbm93IGNoZWNraW5nLlxuIiwgc3RhcnQpOwoJLy9pZighdmFsaWRfZWxmX2ltYWdlKHJlYWxzdGFydCkpCglpZighdmFsaWRfZWxmX2ltYWdlKHN0YXJ0KSkKICAgIHsKCQlwcmludGYoIkVycm9yOiBubyByZWFsIEVMRiBpbWFnZSBpbnN0YWxsZWQgYXMgYm9vdGxvYWRlciFcbiIpOwoJCXJldHVybjsKCX0KCS8vZWxzZSBwcmludGYoIkltYWdlIGZpbGUgaXMgdmFsaWQhIE5vdyBlbGYtbG9hZGluZyAmIHJlbG9jYXRpbmcuXG4iKTsKCgkvL2VudHJ5cG9pbnQgPSBsb2FkX2VsZl9pbWFnZShyZWFsc3RhcnQpOwoJZW50cnlwb2ludCA9IGxvYWRfZWxmX2ltYWdlKHN0YXJ0KTsKCWJscyA9IChXT1JEICgqICkoc3RydWN0IHNibF9jYWxsYmFja19jb250ZXh0ICopKWVudHJ5cG9pbnQ7CgoJLy9wcmludGYoIkVMRiBpbWFnZSBsb2FkZWQgJiByZWxvY2F0ZWQgYXQgJWx4LiBKdW1waW5nIVxuIiwgZW50cnlwb2ludCk7CgoJLy9wcmludGYoIkRlYnVnIGluZm86IGxvYWQgYWRkcmVzcyBub3cgaXMgJTA4bHhcbiIsIGxvYWRfYWRkcik7CgkvL2dldGMoKTsKCXJlc3VsdCA9IGJscyhjb250ZXh0KTsKLyoKCWlmKHJlc3VsdCA9PSBTQkxfUFJPVE9DT0xfVE9PX09MRCkKCXsKCQkvL3ByaW50ZigiVXNpbmcgb2xkZXIgaW50ZXJmYWNlIFxuIik7CgkJZGVncmFkZV90b19vbGRfZnJpZ2dpbmdfaW50ZXJmYWNlKGNvbnRleHQpOwoJCXJlc3VsdCA9IGJscyhjb250ZXh0KTsvL2FuZCB0cmllcyBhZ2FpbiEKCX0KKi8JCglpbnRlcnByZXRfc2JsX2ZhaWx1cmUocmVzdWx0KTsKfQoKc3RhdGljIEJPT0wgaXNfZ29vZF9ib290c291cmNlKGNvbnN0IGNoYXIgKiBjb25zdCBzdHIpCnsKICAvKiBUYWJsZSBhcyBmb2xsb3dzLCBmcm9tIGJpb3NfbWVudS5jCiAgICAgZmxvcHB5IC0+IGludGVybmFsIGZsb3BweSAobm90IHlldCBzdXBwb3J0ZWQpCiAgICAgY2Ryb20gIC0+IGlkZSBDRFJPTShzKQogICAgIGlkZSAgICAtPiBpZGUgZGlzayhzKQogICAgIG5ldCAgICAtPiBURlRQCiAgICAgc2Nkcm9tIC0+IFNDU0kgQ0RST00ocykKICAgICBzY3NpICAgLT4gU0NTSSBkaXNrKHMpCiAgICAgdWNkcm9tIC0+IFVTQiBDRFJPTShzKQogICAgIHVzYiAgICAtPiBVU0IgZGlzayhzKQoKICAqLwogIGlmKGZpbmRfZGFlKHN0cikpCiAgICByZXR1cm4gVFJVRTsKCiAgcmV0dXJuIEZBTFNFOwp9CgojZGVmaW5lIENIRUNLX0lNQUdFX0FORF9aRVJPX0lGX0JBRChwbnQpIFwKCWlmKCF2YWxpZF9lbGZfaW1hZ2UocG50KSkgXAoJCXsgXAoJCWZyZWUocG50KTtcCgkJcG50ID0gMDtcCgkJcHJpbnRmKCJiYWQgRUxGIGltYWdlIGxvYWRlZDsgc2tpcHBpbmchIik7XAoJCX0gXAoJZWxzZSBwcmludGYoImZvdW5kIEFPUzQgU0xCXG4iKTsKCmludCBkb19ib290YShjbWRfdGJsX3QgKiBjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCnsKCS8qIC0gU2NhbiBzZXF1ZW56aWFsZSBzZWNvbmRvIGxlIHZhcmlhYmlsaSBib290KHgpLgoJICAgLSBTZSDoIGZvcnphdGEgdW5hIHNlbGV6aW9uZSBkaSBtZWRpYSB0eXBlLAoJICAgLSBzaSBjZXJjYSBxdWVsbGEuCgkgICAtIHNlIG5vbiBzaSB0cm92YSwgc2kgcmljb21pbmNpYS4KCSAgIC0gUXVpbmRpIGxhIGZ1bnppb25lIGRpIHNjYW5zaW9uZSByaXRvcm5hIHZlcm8gc2Ugc2kg6CB0cm92YXRvIHF1YWxjb3NhOyBpbiBpbmdyZXNzbyBkb3Zy4AoJICAgICBwcmVuZGVyZSBpbCB0aXBvIGRpIGRldmljZSBjaGUgc2kgdnVvbGUuCgkqLwoJY2hhciAqZW52OwoJc3RhdGljIGNoYXIgKmFyZ2FycmF5WzVdID0geyAwIH07CglVV09SRCBhcmdjbnQ9MDsKCVVMT05HIHNlY3Rvcl9zaXplOwoJU0NBTl9IQU5ETEUgc2Nhbm5lciA9IE5VTEw7Cgl2b2lkICpzYmxfYnVmZmVyID0gTlVMTDsKCXNob3J0IFRGVFBfb3B0aW9uc19iYWNrdXAgPSBURlRQX3F1aXRfb25fZXJyb3I7CgogICAgY29uc29sZV9yb3cgPSAxMjsKICAgIGNvbnNvbGVfY29sID0gMDsKICAgIHZpZGVvX2NsZWFyKCk7CgoJVEZUUF9xdWl0X29uX2Vycm9yID0gVFJVRTsKCgkvL2R1bXBfc2lsbHlfaW5mbygpOwogIAoJYmxvY2tidWZmZXIgPSBhbGxvY19tZW1fZm9yX2lvYnVmZmVycyhNQVhfQkxPQ0tTSVpFKTsKCglQUklOVEYoIkZpcnN0LWxldmVsIGJvb3Rsb2FkZXI6IGVudGVyZWQgbWFpblxuIik7CgkvL1JpZ2h0IG5vdyBhcmdjIGFuZCBhcmd2IGFyZSBpZ25vcmVkLi4uLgoKCS8vQnVpbGRzIHRoZSBzZXQgb2Ygc3RyaW5ncyB0byBib290IGZyb20uIFRoaXMgaXMgcGFzc2VkIGFzICJzY2FuX2xpc3QiIHRvIHRoZSBsb3dsZXZlbCBmdW5jdGlvbnMuCgoJZW52ID0gZ2V0ZW52KCJib290MSIpOwoJaWYoZW52KSB7CgkJUFJJTlRGKCJmb3VuZDogJXNcbiIsZW52KTsKCQlpZihpc19nb29kX2Jvb3Rzb3VyY2UoZW52KSkgYXJnYXJyYXlbYXJnY250KytdPXN0cmR1cChlbnYpOwoJfQogIAoJZW52ID0gZ2V0ZW52KCJib290MiIpOwoJaWYoZW52KSB7CgkJUFJJTlRGKCJmb3VuZDogJXNcbiIsZW52KTsKCQlpZihpc19nb29kX2Jvb3Rzb3VyY2UoZW52KSkgYXJnYXJyYXlbYXJnY250KytdPXN0cmR1cChlbnYpOwoJfQoKCWVudiA9IGdldGVudigiYm9vdDMiKTsKCWlmKGVudikgewoJCVBSSU5URigiZm91bmQ6ICVzXG4iLGVudik7CgkJaWYoaXNfZ29vZF9ib290c291cmNlKGVudikpIGFyZ2FycmF5W2FyZ2NudCsrXT1zdHJkdXAoZW52KTsKCX0KCglQUklOVEYoIkZpcnN0LWxldmVsIGJvb3Rsb2FkZXI6IGdvdCAldSB2YWxpZCBib290IHNvdXJjZXNcbiIsIGFyZ2NudCk7CglwdXRzKCJBT1M0IEZMQlxuIik7CgoJaWYoIWFyZ2NudCkgLy9ObyB2YXJpYWJsZXMgc2V0ID8KCQlyZXR1cm4gMDsKCglhcmdhcnJheVthcmdjbnRdPShjaGFyICopMDsgLy8wIHRlcm1pbmF0ZXMuCgoJZm9yKHNjYW5uZXIgPSBzdGFydF91bml0X3NjYW4oKHZvaWQgKilhcmdhcnJheSwgJnNlY3Rvcl9zaXplKTsKICAgICAgc2Nhbm5lcjsKICAgICAgc2Nhbm5lciA9IG5leHRfdW5pdF9zY2FuKHNjYW5uZXIsICZzZWN0b3Jfc2l6ZSkpCgl7CgkJc3dpdGNoKHNjYW5uZXItPnVzaF9kZXZpY2UudHlwZSkgLy9IZXJlIHdlIG1ha2UgZGlzdGluY3Rpb25zIGJldHdlZW4gdGhlIGRpZmZlcmVudCBtZWRpYSBib290IHR5cGVzLgoJCXsKCQkJY2FzZSBERVZfVFlQRV9IQVJERElTSzoKCQkJewoJCQkJVUxPTkcgcF9sb2M7CgkJCQkvL3ByaW50ZigiU2Nhbm5pbmcgSEREICVzICVzICVzIiwgc2Nhbm5lci0+dXNoX2RldmljZS52ZW5kb3IsIHNjYW5uZXItPnVzaF9kZXZpY2UucHJvZHVjdCwgc2Nhbm5lci0+dXNoX2RldmljZS5yZXZpc2lvbik7CgkJCQlwX2xvYyA9IGZpbmRfc2Vjb25kYXJ5X2Jvb3Rsb2FkZXJfc3RhcnRfSEQoc2VjdG9yX3NpemUpOwoKCQkJCVBSSU5URigiRm91bmQgYW4gSERcbiIpOwoJCQkJaWYocF9sb2MgIT0gKFVMT05HKS0xKSAvL0ZvdW5kIHNvbWV0aGluZyEKCQkJCXsKCQkJCQlVTE9ORyBzYmxfbGVuZ3RoID0gMCwgaW9fcmVzOwoJCQkJCS8vdm9pZCAqIGJhc2VfYWRkcmVzczsKCgkJCQkJUFJJTlRGKCJGTEI6IGZvdW5kIHNvbWV0aGluZ1xuIik7CgoJCQkJCWlvX3JlcyA9IHNlY29uZGFyeV9ib290bG9hZGVyX2xlbmd0aChwX2xvYywgc2VjdG9yX3NpemUsICZzYmxfbGVuZ3RoKTsKCgkJCQkJaWYoaW9fcmVzID09IExPQURfT0spCgkJCQkJewoJCQkJCQlQUklOVEYoIkZMQjogU0xCIG9mIGxlbmd0aCAlbHU7IGxvYWRpbmdcbiIsIHNibF9sZW5ndGgpOwoJCQkJCQlzYmxfYnVmZmVyID0gYWxsb2NfbWVtX2Zvcl9ib290bG9hZGVyKHNibF9sZW5ndGgpOwoJCQkJCQlsb2FkX3NlY29uZGFyeV9ib290bG9hZGVyKHBfbG9jLCBzYmxfYnVmZmVyLCBzZWN0b3Jfc2l6ZSwgc2JsX2xlbmd0aCk7CgkJCQkJCS8vcHJpbnRmKCJTdWNjZXNzIVxuIik7CgkJCQkJCUNIRUNLX0lNQUdFX0FORF9aRVJPX0lGX0JBRChzYmxfYnVmZmVyKTsKCQkJCQl9CgkJCQl9CgoJCQkJYnJlYWs7CgkJCX0KCgkJCWNhc2UgREVWX1RZUEVfQ0RST006CgkJCXsKCQkJCS8vRWwgVG9yaXRvIHN0eWxlIGJvb3RpbmcuCgkJCQlkaXNrX3BhcnRpdGlvbl90IHBfaW5mbzsKCQkJCWJsb2NrX2Rldl9kZXNjX3QgKiBibG9ja2RldiA9IGdldF9sb3dsZXZlbF9oYW5kbGVyKHNjYW5uZXIpOwoKCQkJCXByaW50ZigiU2Nhbm5pbmcgQ0QvRFZEICVzICVzICVzIiwgc2Nhbm5lci0+dXNoX2RldmljZS52ZW5kb3IsIHNjYW5uZXItPnVzaF9kZXZpY2UucHJvZHVjdCwgc2Nhbm5lci0+dXNoX2RldmljZS5yZXZpc2lvbik7CgkgICAgCgkJCQlQUklOVEYoIkZvdW5kIGEgQ0RcbiIpOwoJCQkJZ2V0X3BhcnRpdGlvbl9pbmZvKGJsb2NrZGV2LCAwLCAmcF9pbmZvKTsKCQkJCXNibF9idWZmZXI9YWxsb2NfbWVtX2Zvcl9ib290bG9hZGVyKHBfaW5mby5zaXplKnBfaW5mby5ibGtzeik7CgkJCQlQUklOVEYoIkFPUyBDRCBib290IHBhcnRpdGlvbiBvbiBkaXNrIGlzICVsdSBzZWN0b3JzIGxvbmcuXG4iLCBwX2luZm8uc2l6ZSk7CgoJCQkJLyoKCQkJCXJlYWRzZWMgPSBwX2luZm8uc2l6ZSAvIHBfaW5mby5ibGtzejsKCQkJCWlmKChwX2luZm8uYmxrc3ogKiByZWFkc2VjKSA8IHBfaW5mby5zaXplKQoJCQkJCXJlYWRzZWMrKzsgLy8gUFBDIG9wdGltaXplZCEKCQkJCSovCgoJCQkJaWYoYmxvY2tkZXYtPmJsb2NrX3JlYWQoYmxvY2tkZXYtPmRldiwgcF9pbmZvLnN0YXJ0LCBwX2luZm8uc2l6ZSwgc2JsX2J1ZmZlcikgIT0gcF9pbmZvLnNpemUpCgkJCQl7CgkJCQkJcHV0cygiIHJlYWQgZXJyb3Igd2hlbiB0cnlpbmcgdG8gbG9hZCBDRCBzZWNvbmRhcnkgYm9vdGVyXG4iKTsKCQkJCQlmcmVlKHNibF9idWZmZXIpOwoJCQkJCXNibF9idWZmZXI9MDsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQlQUklOVEYoIkNEIGJvb3QgaW1hZ2UgKGVsIFRvcmlubykgbG9hZGVkLiIpOwoJCQkJCUNIRUNLX0lNQUdFX0FORF9aRVJPX0lGX0JBRChzYmxfYnVmZmVyKTsKCQkJCX0KCQkJCWJyZWFrOwoJCQl9CgoJCQljYXNlIERFVl9UWVBFX05FVEJPT1Q6CgkJCXsKCQkJCS8vT2ssIGhlcmUgd2UgdHJ5IHRvIGxvYWQgdGhlIHNlY29uZGFyeSBib290bG9hZGVyIHZpYSBURlRQCgkJCQlpbnQgdHJhbnNmZXJfc2l6ZTsKCQkJCXZvaWQgKiB0ZW1wOwoJCQkJLyogYWxsb2NhdGVzIG1lbW9yeSBmb3IgYm9vdGxvYWRlci4gU2luY2UgdGhlIHVib290IHZlcnkgYnJva2VuIGltcGxlbWVudGF0aW9uCgkJCQkgICBvZiB0ZnRwIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgbmV3ZXIgZXh0ZW5zaW9ucywgSSBjYW4ndCBnZXQgdGhlIGRhbW4gZmlsZSBzaXplLgoJCQkJICAgV2hhdCB0aGUgaGVjaywgdGhlIHRmdHAgZnVuY3Rpb25zIG1pZ2h0IGV2ZW4gY2hva2UgaWYgdGhlIHNlcnZlciBzZW5kcyBhbnkKCQkJCSAgIGV4dGVuc2lvbi4gU28gYSAicmVhc29uYWJseSBiaWciIGFtb3VudCBvZiBtZW1vcnkgaXMgYWxsb2NhdGVkLiAqLwoJCQkJdGVtcCA9IGFsbG9jX21lbV9mb3JfYm9vdGxvYWRlcihCT09UTE9BREVSX01BWF9CVUZGRVIpOwoJCQkJCgkJCQllbnYgPSBnZXRlbnYoIm5ldGJvb3RfZmlsZSIpOwoJCQkJaWYgKGVudiA9PSBOVUxMKSBlbnYgPSAiT1M0Qm9vdGxvYWRlciI7CgoJCQkJUFJJTlRGKCJTdGFydGluZyBOZXQgYm9vdGluZyBwcm9jZWR1cmU7IGxvb2tpbmcgZm9yIGJvb3Rsb2FkZXIuIExvYWQgYWRkcmVzcyB3aWxsIGJlICVseFxuIiwgdGVtcCk7CgkJCQlwdXRzKCJTdGFydGluZyBOZXQgYm9vdGluZyBwcm9jZWR1cmVcbiIpOwoJCQkJaWYgKCh0cmFuc2Zlcl9zaXplID0gbXlfTmV0TG9vcChlbnYsIHRlbXApKSAhPSAtMSkKCQkJCXsKCQkJCQkvL1N1Y2Nlc3MuCgkJCQkJc2JsX2J1ZmZlciA9IHRlbXA7CgkJCQkJQ0hFQ0tfSU1BR0VfQU5EX1pFUk9fSUZfQkFEKHNibF9idWZmZXIpOwoJCQkJCXB1dHMoIlN1Y2Nlc3NmdWxseSBsb2FkZWQgU0xCIGZyb20gbmV0d29ya1xuIik7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCQllbHNlIHByaW50ZigiQ291bGRuJ3QgZG93bmxvYWQgJXMgZnJvbSBuZXR3b3JrLlxuIixlbnYpOwoJCQkJZnJlZSh0ZW1wKTsKCQkJCWJyZWFrOwoJCQl9CgoJCQlkZWZhdWx0OgoJCQkJcHJpbnRmKCJObyBrbm93biBib290IG1ldGhvZCBmb3IgZGV2aWNlIHR5cGUgJWRcbiIsIHNjYW5uZXItPnVzaF9kZXZpY2UudHlwZSk7CgkJfQoKCgkJaWYoc2JsX2J1ZmZlcikgLy9BbHJlYWR5IGxvYWRlZCA/IFRoZW4gc2tpcCB0aGUgb3RoZXIgdW5pdHMgKGRldmljZXMpLgoJCQlicmVhazsKCX0KCgllbmRfdW5pdF9zY2FuKHNjYW5uZXIpOwoJZW5kX2dsb2JhbF9zY2FuKCk7CgoJaWYoc2JsX2J1ZmZlcikKCXsKCQlzdHJ1Y3Qgc2JsX2NhbGxiYWNrX2NvbnRleHQgKiBjYmMgPSBidWlsZF9jYWxsYmFja19jb250ZXh0KGFyZ2FycmF5KTsKCQkvL1Nob3VsZCBpdCBiZSBib290bWVkaWEgaW5zdGVhZCBvZiBmb3VuZG1lZGlhID8KCQkvL1VMT05HICp0ZW1wPShVTE9ORyAqKXNibF9idWZmZXI7CgoJCVBSSU5URigiRkxCOiBTTEIgbG9hZGVkOyBub3cgbGF1bmNoaW5nIGl0XG4iKTsKCgkJLy9OZXcgdmVyc2lvbjogbG9hZHMgdXAgYW4gRUxGIGltYWdlIQoJCXN0YXJ0X3NlY29uZGFyeV9ib290bG9hZGVyKHNibF9idWZmZXIsIGNiYyk7Cgl9CgllbHNlCgl7CgkJcHV0cygiRkxCOiBubyBTTEIgZm91bmQgaW4gYW55IG9mIHRoZSBkZXNpZ25hdGVkIGJvb3Qgc291cmNlczsgcmV0dXJuaW5nIHRvIHUtYm9vdC5cbiIpOwoJfQoJCglURlRQX3F1aXRfb25fZXJyb3IgPSBURlRQX29wdGlvbnNfYmFja3VwOwogIAoJcHV0cygiUHJlc3MgYW55IGtleSB0byBjb250aW51ZVxuIik7CglnZXRjKCk7CgkKCXJldHVybiAwOwp9CgovKiBVYm9vdCAxLjAuMCBzdXBwb3J0IGhlcmUuICovClVfQk9PVF9DTUQoCglib290YSwgICAgICAxLCAgICAgIDAsICAgICAgZG9fYm9vdGEsCgkic3RhcnQgQW1pZ2FPUyBib290IHByb2NlZHVyZSIsCgkiLiAnQm9vdGEnIGFsbG93cyB0byBib290IEFtaWdhT1MgYWxpa2UgT1NlcyBvbiBTYW1cbiIKLy8JIi4gJ0Jvb3RhJyBpcyBhIGdyZWF0IGNvbW1hbmQsIHRoYXQgZW5hYmxlcyB5b3UgdG8gZG8gdGhpbmdzIHRoYXQgYmVmb3JlXG53ZXJlIG9ubHkgZHJlYW10IG9mLlxuTmFtZWx5LCBib290aW5nIEFtaWdhT1M0IG9uIGFuIEExLlxuQXNpZGUgZnJvbSB0aGF0LCBpdCB0YWtlcyBubyBhcmd1bWVudHMsIHNvIGFueSBleHRlbmRlZCBoZWxwIGlzIG9mIG5vIGhlbHAuXG5PbiB0aGUgb3RoZXIgaGFuZCwgaXQgdXNlcyBhIGJ1bmNoIG9yIHJ1dGhsZXNzIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byB3b3JrLCBzbyB5b3UgbWlnaHQgd2FudCBzb21lIGluc2lnaHQgaW50byB0aGVzZSBpbnNpZ2h0ZnVsIG1hdHRlcnMuXG5GaXJzdCBvZiBhbGwsIGNvbWUgdGhlIHRocmVlICdib290bWVkaWEnIHR3aW5zLCBuYW1lZCAnYm9vdDEnLCAnYm9vdDInIGFuZFxuJ2Jvb3QzJyAod2UgaGF2ZSB0aHJlZSBvZiB0aGVtIHNvIHRoZXkgYXJlIG9uZSBtb3JlIG9mIHRoZSBGcmllZGVucykuXG5FYWNoIG9mIHRoZXNlIGNhbiBiZSBzZXQgdG8gYSBjb3JyZXNwb25kaW5nIGJvb3Qgc291cmNlIHRoYXQgd2lsbCBiZSBzY2FubmVkLFxuc3RhcnRpbmcgLSBndWVzcyB3aGljaCBvbmUgLSBmcm9tICdib290MScuIEFsbG93ZWQgYm9vdCBzb3VyY2VzIGFyZSAnbmV0JyBBS0FcbmJyb2tlbi1URlRQLWJvb3RpbmctZG9udC10cnktbWUsICdjZHJvbScsICdpZGUnLCB0aGF0IGFyZSBJREUvQVRBUEkgQ0RSb20gYW5kXG5IREQscmVzcGVjdGl2ZWx5LCAnc2Nkcm9tJyBhbmQgJ3Njc2knLCBzYW1lIGFzIGFib3ZlIGJ1dCBmb3IgU0NTSSBhbmQgZmluYWxseVxuJ3VjZHJvbScgYW5kICd1c2InLCBtZWFuaW5nIG9mIHdoaWNoIGlzIGxlZnQgdG8gZmlndXJlIG91dCBvbmx5IHRvIHRoZSBzbWFydGVzdCBvZiB5b3UuXG5Cb290aW5nIGZyb20gZmxvcHB5IGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGFuZCB3aGVuIHJlYWR5IHdpbGwgcHJvYmFibHkgbGVhdmUgc29tZW9uZSBzdGlsbCBndWVzc2luZyB3aGF0IGlzIGl0IHVzZWZ1bCBmb3IgKGdyZWV0aW5ncyB0byBFbHdvb2QgYW5kIE1hcnRpbiBTKS5cbklmIHlvdSBkZWNpZGUgdG8gZ2l2ZSBjb250cm9sIHRvIHRoaXMgY3JhenkgYnVuY2ggb2YgYnVnZ3kgYml0cywgaXQnbGwgdHJ5IHRvXG5sb2FkIHRoZSBzZWNvbmQtc3RhZ2UgYm9vdGxvYWRlciBmcm9tIHRoZSBib290IHNvdXJjZXMgc3BlY2lmaWVkLCBhbmQgcGFzc1xuY29udHJvbCB0byBpdC5cbk9uY2UgdGhlIHNlY29uZC1zdGFnZSBib290bG9hZGVyIHRha2VzIGNvbnRyb2wsIGl0J2xsIHNjYW4gZm9yIGF2YWlsYWJsZVxua2lja3N0YXJ0IGNvbmZpZ3VyYXRpb25zLCBwcm9tcHQgdGhlIGRlZXBlc3QgY29ybmVyIG9mIHlvdXIgc291bCBmb3Igd2hpY2hcbmNvbmZpZ3VyYXRpb24gdG8gbG9hZCwgYW5kIHRoZW4gc3RhcnQgdGhlIFJFQUwgZnVuXG4oLi4uIG9yIGF0IGxlYXN0IGF0dGVtcHQgdG8pLlxuSGF2ZSBhIG5pY2UgZGF5LiIKKTsK